STM8S003F3使用总结——串口

STM8作为低成本芯片一直受到广大用户青睐,最近一个项目使用了STM8S003F3P6这款芯片,主要实现的功能就是串口接收指令控制PWM输出。这里对这款芯片使用过程中遇到的问题进行总结。

编译环境:IAR for STM8 3.10.2
库版本:V2.2.0

1.STM8S003F3与STM8S103F3差异

STM8S003F3 STM8S103F3
FLASH擦写次数 100 10k
EEPROM大小 128字节 640字节
EEPROM读写次数 100k 300k

除了以上差异,两款芯片可pin-to-pin兼容,片内外设资源一致。

2.串口通信

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中断也会出现相同情况。 解决方案有两种:

  1. 使用UART1_IT_RXNE_OR作为接收中断;
  2. 将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_RXNE )    || \      //重定义内容
   ((Interrupt) == UART1_IT_IDLE)     || \
   ((Interrupt) == UART1_IT_LBDF))

然而,一重山过又一重险,进入接收中断后清中断标志的时候又出现了相同的问题。。。
STM8S003F3使用总结——串口_第1张图片
按照原来的思路,发现还是一样的问题,检查参数函数中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使用总结——定时器

你可能感兴趣的:(单片机)