STM8S003F3使用总结——串口

2019-11-30来源: eefocus关键字:STM8S003F3  使用总结  串口

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

编译环境:IAR for STM8 3.10.2

库版本:V2.2.0


1.STM8S003F3与STM8S103F3差异

blob.png

除了以上差异,两款芯片可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中断也会出现相同情况。 解决方案有两种:


使用UART1_IT_RXNE_OR作为接收中断;

将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))


然而,一重山过又一重险,进入接收中断后清中断标志的时候又出现了相同的问题。。。


按照原来的思路,发现还是一样的问题,检查参数函数中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  使用总结  串口 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481619.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm8s003f3使用杂记
下一篇:stm8l151低功耗程序架构

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8s003f3使用杂记
转换模式,怎么从缓存区读回各路转换结果?用GETBUFFERVALUE(直接写寄存器组的序号就行)函数。之前要调用相应的配置函数:ADC1_DataBufferCmd(FunctionalState NewState);参考RM0016——page366中关于数据缓存寄存器的介绍。此时要用DMA传送结果。8:为什么已经修改了stm8s.h文件,ADC1部分的定义还是会在编译时提示没有定义呢?甚至把那部分的定义放到主函数里也不行呢。这种无厘头的问题------重新建个工程就行了。>我*?!!!事实再一次证明,新建工程也不管用啊!!!conf没改好吧??(我已经放弃了,包含了iostm8s003f3的源文件然后用寄存器写的
发表于 2019-11-30
STM8S003F3 使用内置的Data EEPROM的操作接口
操作系统:win10 64bit平台:STM8S003F3 IDE: IAR For STM8/* Data EEPROM 操作初始化 */void Init_Flash(void){  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);} /************************************************函数名称 : EE_FLASH_WriteNByte功    能 : 写EEPROM参    数 : pBuffer ----- 写入数据区首地址   
发表于 2019-11-30
stm8s103f3p6的延时函数
使用stm8s时本来期望能够产生1us精度的脉冲,但是调来调去也没能实现。目前的情况是使用内部16MHz的RC时钟源,然后给到timer4,再经 8分频产生一个25us的中断,我能搞出来的最小中断周期是15us左右,考虑到那不是一个很好的整数,主要是当要延时整数比如100,1000时没办法除尽,所以就只好取25us为一个最小单位了。如果有人能用定时器产生1us的脉冲请指点一下。多谢。 下面上代码吧: 基本的思路就是使用timer4每隔25us计数一次,然后延时函数对timer4的中断次数进行统计。完成指定的延时时间后退出while循环。#include"stm8s.h"uint8_t
发表于 2019-11-28
STM8S103F3P6核心板原理图设计
Encounter problems:1.无法执行DRC检查2.图纸页面无法设置Solution:1.选中.dsn文件,即便可以执行DRC检查2.设置schematic page properties   3.瓷片电容封装RAD是瓷片电容的封装,一般104.103.222.33.这些的封装是RAD0.1,而RAD0.2的就是比较大,可以说是元器件管脚的距离是200mil。。RAD0.1封装是无极性电容,0.1是指这个电容在电路板上的焊盘间距为100mil(1mil=0.0254mm)。RB.1/.2封装是指有极性电容,后面的.1/.2是指这个电容在电路板上两引脚之间的间距是100mil,它的外径是200mil。
发表于 2019-11-27
STM8S103F3P6核心板原理图设计
STM8S103F3P6核心板学习笔记
开发板与仿真器连接:新建一个项目:    1-启动IAR,选择Project->Create New Projects…    2-选择C    3-然后选择路径并指定文件名,然后按Save保存    4-然后选Project->Options…设置项目属性    5-General options -> Target -> Device -> STM8S -> STM8S103F3P    6-Debugger -> Setup -> Driver ->
发表于 2019-11-27
STM8S103F3P6核心板学习笔记
MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
比较器B是什么,顾名思义,它其实就是用来比较模拟电压+输入端和-输入端的电压大小,然后设置输出信号CBOUT的值的,如果 + 端电压高于 - 端电压,则CBOUT置高,否则置低。主要的控制寄存器有CBCTL0,CBCTL1,CBCTL2,CBCTL3,CBINT,CBIV,在MSP430G2553中没有比较器B,但是F5336中有,所以接下来的代码全都是F5336的比较器B使用程序:1.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用共享电压源产生2.0V参考电压。最后当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平,当CB0输入模拟信号电压低于2.0V时,输出低电平
发表于 2019-11-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved