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中断也会出现相同情况。 解决方案有两种:
- 使用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使用总结——定时器
STM8S003F3使用总结——串口相关推荐
- STM8S003F3通过PWM波实现三基色呼吸灯
前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录. 1 综述 我们知道,要是的LED灯亮直接通电即可.而要改变灯的亮度,我们有两种方法:改变电流和PWM调光. 我 ...
- python第三方库之学习pyserial库--串口通信
pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...
- 【嵌入式】openmv与stm32的串口通信
参考:(文中部分图/文字/代码来自以下文章,部分内容由于时间久远已经找不到原作者,可联系注明或删除) PYTHON串口数据打包发送STM32接收数据解析 openmv中文文档 这里以openmv循迹代 ...
- Android 串口通讯 获取卡号
首先你的andoridstudio 需要配置ndk 环境 然后在去下载谷歌的的demo 下载地址 把这些直接复制到代码中 一般 jni C语言调用java 是指定包名调用的 所有android_se ...
- 51单片机 小车 L298N pwm调速 串口控制 按键控制
难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...
- VC串口通信编程-2
VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...
- pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装
一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...
- rs232串口驱动_LED驱动电路设计
这里设计了两种方案,方案一目标需要低功耗的led,方案二目标需要高功耗的LED.这里重点说下第一种方案,方案电路图如图所示.LED直接通过一个上拉排阻将8个LED连接在单片机上,这样的优点是电路结构简 ...
- 3.实现串口功能及消息邮箱
提醒: 如果您是完全按照<1.一步一步移植ucos到stm32f103开发版(修订版)>来新建的工程的话,那很遗憾,你要重新建立一个工程,因为,在那篇文章的步骤1中,我们选中了GPIO,但 ...
- xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习
一.美系厂家Rockwell ABRockwell的PLC主要是包括:PLC2.PLC3.PLC5.SLC500.ControlLogix等型号,PLC2和PLC3是早期型号,现在用的比较多的小型PL ...
最新文章
- push、pop指令
- 一个适合于Python 初学者的入门练手项目
- 转载:Quartz.NET 入门
- python代码大全p-21行Python代码实现拼写检查器
- Python/Anaconda-python2.x代码转为python3.x代码
- python中的列表是指针吗_Python中的指针——到底指什么(二)
- leetcode389. 找不同
- at moment的用法 the_值得收藏!初中英语10大词类详解+用法+考点, 这一篇全齐了!...
- 实现动态验证码的思路
- C语言求解100的带分数形式的代码
- 火狐浏览器书签工具栏固定书签宽度
- T-MGCN时间多图卷积网络用于交通流预测
- 多国语言点阵字库合并!!!
- 二维码防伪系统开发-实现了产品信息防伪的高效性
- 苹果加快自研脚步,被国产厂商逼的?
- matlab根号下是多项式,多项式求根
- 钉钉通知-调用钉钉发送企业内部消息开发
- 青岛地铁不能让你的房子升值
- 腾讯云服务器无法通过密钥登录
- .shp文件的存储结构是怎样的?底层读取shapefile文件