|
1. CLK->PCKENR1 使能 CLK_PCKENR1_UART1 无效 想降低功耗,单独打开 CLK_PCKENR1_UART1,但UART无输出。( z9 Y9 m/ T1 s# P; Z) E 核对资料发现:
解决方法: 不要使用 stm8s.h中的 CLK_PCKENR1_UART1; l9 ?" ]2 c$ [* ^/ ` o 自己使能 bit3 5 J. z7 W! g8 @( x |
STM8自学笔记(推荐STM8很好的入门电子书)
无刷直流电机控制应用+基于STM8S系列单片机---电子书
【精华资料】STM8Sxx固件库FOR IAR
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
微信公众号
手机版
, c; g1 O0 {* k# \- {
7 S6 h& R% n' T
2. PD4 TIM2_CH1没有反应
/ G- I* @- G9 n7 e9 A. L7 n
* X/ h. F7 M- `
同样的 PD3 TIM2_CH2则完全正常。
8 S4 b9 W8 Y* |$ ^% _$ @" Z/ k
经各种跳坑调试后发现,为了使用 PC7 [TIM1_CH2] 和 PC6 [TIM1_CH1]
所以在option bytes里面启动了 AFR0
/ n) O' H5 s7 P6 l& A0 t. `2 ?
数据手册对 AFR0 描述如下:
AFR0 Alternate function remapping option 0(2)* S* C9 p! d8 w( |) F2 u- J3 L
0: AFR0 remapping option inactive: Default alternate functions(1), H' | I8 h! X5 X7 G$ e" y5 ]% t7 g
1: Port C5 alternate function = TIM2_CH1; port C6 alternate function =
TIM1_CH1; port C7 alternate function = TIM1_CH2.8 B5 r D% |+ d$ O0 E" E- W
, ?. i8 j- N0 ]9 ~& u. l9 R: G: q
也就是说 TIM2_CH1也被映射走了,换成 PC5 TIM2_CH1 就完全正常了。
但刚才翻资料看到这句就懵了。4 v& {5 h, l; E5 l. Y, w J3 r6 ~( w
) U Q% k$ Q, }1 R6 F
4 I0 o, E( ^; y' D$ d+ |8 Y/ h H
这个暂时还没得到答案!为保险起见,决定不使能AFR1,还是修改电路,把 PD2 [TIM2_CH3] 还是换成PA3 TIM2_CH3。
STM8L流水灯
*5 g6 P) a! P2 v6 p7 a; J* ~ d" X+ L
* Copyright (c) 2002-2005 STMicroelectronics0 F6 W& i3 i6 C) x0 B( s
*/) H8 R0 ^( x( |* R
( y. i. V/ ?, ]( g2 w7 h
#include <stm8l052c6.h>
void delay(unsigned int time);4 I, ^+ z* M' d' N
void main(void)3 y$ S: p' D9 Y. y. T8 l
{# T% k. J( X w7 A
unsigned char i=0;" T1 V! z" Q: e' L! H) ?& Z/ d
PD_DDR=0x02; //设置PD1为输出模式' S7 h! O9 h; J# J J# q2 c
PD_CR1=0x02; //设置PD1为推挽输出; g! O0 z8 M9 \4 G9 V7 x! L# }
PD_CR2=0x02; //设置PD1输出速率为16mhz
PB_DDR=0x1e; //设置PB1~PB4为输出模式
PB_CR1=0x1e; //设置PB1~PB4为推挽输出
PB_CR2=0x1e; //设置PB1~PB4输出速率为16mhz
CLK_CKDIVR=0x07; //对HSI进行128分频,16MHZ/128=125KHZ! g' |$ Y% l7 j/ N, W4 p- O, C' \
while(1)8 j+ t B; K! H+ I, h
{
PD_ODR=0xfd; //PD1(红)灭5 Y. G0 j6 i5 W; J
switch(i), B2 T. R/ l4 u4 u5 e1 P3 t; }
{
case 0: PD_ODR=0xff;break; //PD1(红)亮
case 1: PB_ODR=0x02;break; //PB1继电器启动
case 2: PB_ODR=0x04;break; //PB2继电器启动
case 3: PB_ODR=0x08;break; //PB3继电器启动
case 4: PB_ODR=0x10;break; //PB4继电器启动4 f9 R. V, _% o8 Z" n" P/ a7 E# g9 p& N
}/ G( D9 c! f4 ]1 z
delay(12500); //延时1S/ b# m# f9 S1 J4 j6 E8 Y; f" b7 l
i++;; ^- y8 ?' t0 Q& f9 \- W
if(i==5)0 E/ }$ ]+ `' @
{) G) L* k L( ?; {9 r$ K
i=0;
}
}
}
void delay(unsigned int time)) A$ I H, P1 _4 W# G7 r# @3 W, X
{
while(time--);
}
继电器可以换成LED灯2 A% n* x' M& D& A. H6 k1 a
STM8的乘除法指令是8位的,做16位或以上乘法运算时,编译器实际上调用了一个函数(通用作法);6 L8 E6 c* z4 y! K
而这个函数竟然用到了几个编译器自定义的全局变量(猜测);9 z. b( Q x3 X; \
在进入中断时,这几个全局变量是不会被自动保存的,从而造成这个乘法运算函数不可重入;
当主程序和中断同时使用8位以上乘除法时,自然就出错。% }' d( F6 v6 \! I5 ?# X( a
从芯片或编译器上面想办法基本上不太可行,那么从软件上规避吧。
STM8L间隔1S闪烁
* s$ N9 ^% p5 p& s% S" y6 V+ V
* Copyright (c) 2002-2005 STMicroelectronics* R* _# T6 A# K- W+ s( ` R
*/
, d7 g( G7 v5 Y$ n; ] `0 c1 O
#include <stm8l052c6.h>$ ~( O% Y( D0 z$ a- n( H. O, P* p
void delay(unsigned int time);
void main(void)
{
int i;
PD_DDR=0x03; //设置PD0,PD1口为输出模式+ C, E8 N& W& d4 o& H: S/ A
PD_CR1=0x03; //设置PD0,PD1口为推挽输出
PD_CR2=0x03; //设置PD0,PD1口输出速率为16mhz
CLK_CKDIVR=0x07; //对HSI进行128分频,16MHZ/128=125KHZ
for(i=0;i<10;i++)0 t4 j- b0 w3 y% x
{8 M* _9 `8 p/ I0 [
PD_ODR=0xfe; //PD1(红)亮( V i! d; I' d. T; |
delay(12500); //延时1S
PD_ODR=0xfc; //PD1(红)灭
delay(12500); //延时1S
}
}. y1 U1 C, F. Z$ D6 l1 M
void delay(unsigned int time): Z3 T% @2 s% z/ C# j1 s
{+ x1 }' {0 E9 i2 K) z0 F2 M
while(time--);$ {0 H3 K9 r4 d# O, q! |9 f
}# r* l* @) i- Q' q7 l! O- Q% g
有需要的朋友可以来看看/ J% j: _9 M! X8 Z% ~: _
STM8S003F3P6共享资料
1 b+ q0 m! S. I* X2 h& ^
2 A% B6 u3 b9 W0 n
% b( c* ]* F6 d, @ h
% W* { B8 h6 s