STM8作为低成本芯片一直受到广大用户青睐,最近一个项目使用了STM8S003F3P6这款芯片,主要实现的功能就是串口接收指令控制PWM输出。这里对这款芯片使用过程中遇到的问题进行总结。
编译环境:IAR for STM8 3.10.2
库版本:V2.2.0
STM8S003F3 | STM8S103F3 | |
---|---|---|
FLASH擦写次数 | 100 | 10k |
EEPROM大小 | 128字节 | 640字节 |
EEPROM读写次数 | 100k | 300k |
除了以上差异,两款芯片可pin-to-pin兼容,片内外设资源一致。
STM8S003F不支持DMA,因此使用中断方式接收。中断向量表如下:
typedef enum { UART1_IT_TXE = (uint16_t)0x0277, /*!< Transmit interrupt */
UART1_IT_TC = (uint16_t)0x0266, /*!< Transmission Complete interrupt */
UART1_IT_RXNE = (uint16_t)0x0255, /*!< Receive interrupt */
UART1_IT_IDLE = (uint16_t)0x0244, /*!< IDLE line interrupt */
UART1_IT_OR = (uint16_t)0x0235, /*!< Overrun Error interrupt */
UART1_IT_PE = (uint16_t)0x0100, /*!< Parity Error interrupt */
UART1_IT_LBDF = (uint16_t)0x0346, /**< LIN break detection interrupt */
UART1_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */
} UART1_IT_TypeDef;
其中RX中断有两种,UART1_IT_RXNE 和 UART1_IT_RXNE_OR,在使用过程中仅UART1_IT_RXNE_OR能够触发中断,而UART1_IT_RXNE中断会导致程序跑飞,带着疑问查询了网上的相关问题和库函数,发现问题所在。在检查参数函数中:
assert_param(IS_UART1_CONFIG_IT_OK(UART1_IT));
其中,IS_UART1_CONFIG_IT_OK定义如下:
#define IS_UART1_CONFIG_IT_OK(Interrupt) \
(((Interrupt) == UART1_IT_PE) || \
((Interrupt) == UART1_IT_TXE) || \
((Interrupt) == UART1_IT_TC) || \
((Interrupt) == UART1_IT_RXNE_OR ) || \
((Interrupt) == UART1_IT_IDLE) || \
((Interrupt) == UART1_IT_LBDF))
定义中并没有UART1_IT_RXNE,因此UART1_IT_RXNE会被视为非法参数。同样,如果用到UART1_IT_OR中断也会出现相同情况。 解决方案有两种:
#define IS_UART1_CONFIG_IT_OK(Interrupt) \
(((Interrupt) == UART1_IT_PE) || \
((Interrupt) == UART1_IT_TXE) || \
((Interrupt) == UART1_IT_TC) || \
((Interrupt) == UART1_IT_RXNE_OR ) || \
((Interrupt) == UART1_IT_RXNE ) || \ //重定义内容
((Interrupt) == UART1_IT_IDLE) || \
((Interrupt) == UART1_IT_LBDF))
然而,一重山过又一重险,进入接收中断后清中断标志的时候又出现了相同的问题。。。
按照原来的思路,发现还是一样的问题,检查参数函数中IS_UART1_CLEAR_IT_OK的定义如下:
#define IS_UART1_CLEAR_IT_OK(ITPendingBit) \
(((ITPendingBit) == UART1_IT_RXNE) || \
((ITPendingBit) == UART1_IT_LBDF))
怀疑人生了,参数表只有两个中断标志选项,WTF…解决方法同上,我是直接清UART1_IT_RXNE中断标志。
下一篇 STM8S003F3使用总结——定时器