|
1. CLK->PCKENR1 使能 CLK_PCKENR1_UART1 无效 想降低功耗,单独打开 CLK_PCKENR1_UART1,但UART无输出。 核对资料发现:
解决方法: 不要使用 stm8s.h中的 CLK_PCKENR1_UART1 自己使能 bit3 |
STM8 的MCU有四个供电单元
【STM8-SO8】08-STM8L001J3的点灯
STM8单片机如何实现Bootloader
基于STM8的DALI (数字可寻址调光协议)
开源基于STM32的STM8脱机编程器
【ST MCU实战经验】之STM8中UART奇偶校验的使用方法
【思修电子STM8集合贴】龙顺宇STM8理论/实战视频/书籍/软件/
初次尝试STM8S001J3
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
基于STM8的实验代码汇总分享
微信公众号
手机版
2. PD4 TIM2_CH1没有反应
同样的 PD3 TIM2_CH2则完全正常。
经各种跳坑调试后发现,为了使用 PC7 [TIM1_CH2] 和 PC6 [TIM1_CH1]
所以在option bytes里面启动了 AFR0
数据手册对 AFR0 描述如下:
AFR0 Alternate function remapping option 0(2)
0: AFR0 remapping option inactive: Default alternate functions(1)
1: Port C5 alternate function = TIM2_CH1; port C6 alternate function =
TIM1_CH1; port C7 alternate function = TIM1_CH2.
也就是说 TIM2_CH1也被映射走了,换成 PC5 TIM2_CH1 就完全正常了。
但刚才翻资料看到这句就懵了。
这个暂时还没得到答案!为保险起见,决定不使能AFR1,还是修改电路,把 PD2 [TIM2_CH3] 还是换成PA3 TIM2_CH3。
STM8L流水灯
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include <stm8l052c6.h>
void delay(unsigned int time);
void main(void)
{
unsigned char i=0;
PD_DDR=0x02; //设置PD1为输出模式
PD_CR1=0x02; //设置PD1为推挽输出
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
while(1)
{
PD_ODR=0xfd; //PD1(红)灭
switch(i)
{
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继电器启动
}
delay(12500); //延时1S
i++;
if(i==5)
{
i=0;
}
}
}
void delay(unsigned int time)
{
while(time--);
}
继电器可以换成LED灯
STM8的乘除法指令是8位的,做16位或以上乘法运算时,编译器实际上调用了一个函数(通用作法);
而这个函数竟然用到了几个编译器自定义的全局变量(猜测);
在进入中断时,这几个全局变量是不会被自动保存的,从而造成这个乘法运算函数不可重入;
当主程序和中断同时使用8位以上乘除法时,自然就出错。
从芯片或编译器上面想办法基本上不太可行,那么从软件上规避吧。
STM8L间隔1S闪烁
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include <stm8l052c6.h>
void delay(unsigned int time);
void main(void)
{
int i;
PD_DDR=0x03; //设置PD0,PD1口为输出模式
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++)
{
PD_ODR=0xfe; //PD1(红)亮
delay(12500); //延时1S
PD_ODR=0xfc; //PD1(红)灭
delay(12500); //延时1S
}
}
void delay(unsigned int time)
{
while(time--);
}
有需要的朋友可以来看看
STM8S003F3P6共享资料