STM8L052使用官方库编程的注意事项(持续更新)

最近项目用到了STM8L052这颗片子,陆陆续续的踩了不少坑,趁着有时间整理出来,废话说完。

官方标准外设库的下载地址

stm8官方网站
STM8L15x/16x/05x/AL3Lx/AL31x使用的是同一个标准外设库,所以我使用的STM8L052也适用,直接下载即可。

EXTI中断注意事项

我在开发过程中,遇到了一个诡异的问题,程序运行特别慢,往往一条指令需要执行一秒乃至数秒才能完成,我当时百思不得其解,甚至一度怀疑是IAR开发环境的问题,还为此搭建了ST官方STVD开发环境,问题依旧存在。
静下心来,从建立一个空的工程开始一步步的添加自己的功能,发现在配置完外部中断以后,问题开始出现。好了,现在我可以确定问题出现在外部中断上,找到外部中断的函数定义,

/**
  * @brief  Sets the external interrupt sensitivity of the selected pin.
  * @note   Global interrupts must be disabled before calling this function.
  * @note   The modification of external interrupt sensitivity is only possible
  *         when he interrupts are disabled.
  * @note   The normal behavior is to disable the interrupts before calling this
  *         function, and re-enable them after.
  * @param  EXTI_Pin : The pin to configure.
  *          This parameter can be one of the following values:
  *            @arg EXTI_Pin_0: GPIO Pin 0
  *            @arg EXTI_Pin_1: GPIO Pin 1
  *            @arg EXTI_Pin_2: GPIO Pin 2
  *            @arg EXTI_Pin_3: GPIO Pin 3
  *            @arg EXTI_Pin_4: GPIO Pin 4
  *            @arg EXTI_Pin_5: GPIO Pin 5
  *            @arg EXTI_Pin_6: GPIO Pin 6
  *            @arg EXTI_Pin_7: GPIO Pin 7              
  * @param  EXTI_Trigger : The external interrupt sensitivity value to set.
  *          This parameter can be one of the following values:
  *            @arg EXTI_Trigger_Falling_Low: Interrupt on Falling edge and Low level
  *            @arg EXTI_Trigger_Rising: Interrupt on Rising edge only  
  *            @arg EXTI_Trigger_Falling: Interrupt on Falling edge only 
  *            @arg EXTI_Trigger_Rising_Falling: Interrupt on Rising and Falling edges       
  * @retval None
  */
void EXTI_SetPinSensitivity(EXTI_Pin_TypeDef EXTI_Pin, EXTI_Trigger_TypeDef EXTI_Trigger)

我看到了这么一句话“The modification of external interrupt sensitivity is only possible when he interrupts are disabled.”翻译过来就是,在修改外部中断的触发方式之前,需要关闭总中断。
OK,在MEMORY里找到EXTI.CR1寄存器对应的地址,发现在配置前后该值的确没有变化。翻手册,找到EXTI寄存器定义
EXTI寄存器
EXTI寄存器描述
从这里就可以看出来,默认的外部中断触发方式是下降沿和低电平都可以触发,而我自己配置的上升沿触发没有配置成功,所以在低电平的时候会一直进入这个中断函数,导致主函数的运行一直被打断,所以就有了开头描述的那个现象,程序运行特别慢,往往一条指令需要执行一秒乃至数秒才能完成。
但单片机复位以后总中断默认是关闭的啊,我是什么时候打开的总中断呢?
撸了一遍代码,发现在配置外部中断之前我调用了demo里的RTC配置函数,然后在这个函数里隐藏了一句:

enableInterrupts();

问题找到,屏蔽掉这一句,解决。

RTC WAKEUP周期配置

因为低功耗的要求,使用RTC每十分钟唤醒一次,其余时间出于halt模式,RTC配置如下:

static void RTC_Config(void)
{
    /* Enable RTC clock */
    CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_32);
    /* Wait for LSE clock to be ready */
    while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);
    /* wait for 1 second for the LSE Stabilisation */
    LSE_StabTime();
    CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
    /* Configures the RTC wakeup timer_step = 1/(RTCCLK/16) = 1/((LSE/32)/16) = 15.625 ms */
    RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
    /* Enable wake up unit Interrupt */
    RTC_ITConfig(RTC_IT_WUT, ENABLE);
    /* RTC wake-up event every 10 min*/
    RTC_WakeUpCmd(DISABLE);
    RTC_SetWakeUpCounter(38400);
    RTC_WakeUpCmd(ENABLE);
}

需要注意的是,在调用RTC_SetWakeUpCounter之前需要先RTC_WakeUpCmd(DISABLE),这样配置才能生效。而且RTC一些寄存器在单片机复位时是不会重置的,只有掉电才会重置,比如:
RTC寄存器

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值