历史上的今天
今天是:2024年09月17日(星期二)
2019年09月17日 | STM8L USART串口使用
2019-09-17 来源:eefocus
STM8L上有多个串口,最多可达5个,分别为USART1~USART5,但依据型号不同,搭载数量并不相同。
以STM8L052R8为例,其只具有USART1~USART3。
因为STM8系列功能众多,很多Pin都是复用的,因此使用前必须检查STML的参考手册。
通过手册可知,以USART1为例,RX/TX可以使用以下的管脚,默认是PC2/PC3,
如果要变更,需要修改SYSCFG remap control register 1 (SYSCFG_RMPCR1)的5:4位进行切换。
Bits 5:4 USART1TR_REMAP[1:0]: USART1_TX and USART1_RX remapping
00: USART1_TX on PC3 and USART1_RX on PC2
01: USART1_TX on PA2 and USART1_RX on PA3
10: USART1_TX on PC5 and USART1_RX on PC6
11: Reserved
初始化:
// USART init
USART_DeInit(USART1);
// PC2-RX PC3-TX 端口上拉
GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, ENABLE);
// 初始化参数
USART_Init(USART1,
(uint32_t)9600,
USART_WordLength_8b,
USART_StopBits_1,
USART_Parity_No,
USART_Mode_Rx | USART_Mode_Tx); // 允许读和写
// 开中断
// 一般需要写时再开写中断,否则写中断会非常频繁以至于始终在执行中断
// 读中断看具体业务
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_TC, ENABLE);
/* Enable USART 使能 */
USART_Cmd(USART1, ENABLE);
关闭串口
GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, DISABLE);
USART_Cmd(USART1, DISABLE );
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
读写处理(异步)
void uart_begin_read(uint8_t len)
{
// prepare send data
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
// 初始化读缓冲
read_idx = 0;
read_len = len;
// 开始读(开读中断)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
void uart_begin_write(uint8_t* data, uint8_t len)
{
// prepare send data
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
// 初始化写缓冲(复制待写数据等)
memcpy(writ_buffer, data, len);
writ_idx = 0;
writ_len = len;
// 开始写(开写中断)
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
return;
}
中断处理
// 写中断处理
INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler, 27)
{
// 发送1字节
USART_SendData8(USART1, writ_buffer[writ_idx++]);
USART_ClearITPendingBit(USART1, USART_IT_TC);
// 等待缓冲数据全部写出后,关写中断
if( writ_idx == writ_len ) {
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
// 你的处理
}
}
// 读中断处理
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)
{
uint8_t temp = 0;
// 读1字节,存入读缓区
temp = USART_ReceiveData8(USART1);
read_buffer[read_idx++] = temp;
// 等待全部读完后(如果有设定读长度的话)关读中断
// 这里根据具体业务,可以不关中断一直接受数据
if( read_idx == read_len ) {
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}
}
上面示例是异步读写,加一个状态等待的循环判断,可改为同步读写。
下一篇:STML8的中断使用小结
史海拾趣
|
最近我使用IWOW的TR800来做一个无线数传的项目,我在想移动既然分配给模块的ip是内网ip,那是否意味着两个模块连上GPRS网络之后,他们都是获得同一内网里的ip,就像连接到同一路由器里面的两台机器一样? 另外共享一下我觉得不错的技术QQ群 群5 ...… 查看全部问答> |
|
目录: 第一章 线性电路的复数解法 1.1 电源与元件的概念 1.2 常参量线性电路的复数解法 1.3 一阶RC滤波器 1.4 二级LC滤波器 思考题 习题 第二章 线性电路的s域解法 2.1 拉普拉斯变换 2.2 线性电路的s域解法 2.3 卷积 附录2 拉氏变换 ...… 查看全部问答> |
|
本人一直在一家电源IC原厂华东区做FAE,07年公司从linear挖了一个团队进入LED驱动行业,我随之也开始进入这个行业。在勤勤勉勉的耕耘3年中,我从学习到与客户分享我的学习经验,很多客户都会跟我讲,王工,从你身上我学到了很多。但这时我告诫自己 ...… 查看全部问答> |
|
原来用的6416的片子,现在用的2407,想问下怎么能一上电就让dsp芯片运行我的程序?小弟新手希望各位大侠教的详细点,有资料发我邮箱也可以hljlishen0517@gmail.com 多谢各位了… 查看全部问答> |
|
主板芯片: Intel 6700 PXH 64 bit PCI Express to PCI-X Hub,CPU是INTEL的 Sossaman。 现在就是没有仿真到芯片组,另外,因为没有Super I/O芯片,CPLD时序设置也有点不太清楚。 请高手帮忙调试出来。 我的msn:dq_lu@hotmail.com … 查看全部问答> |
|
如何设置vxworks(主机)的IP地址,和网关?如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗 如何设置vxworks(主机)的IP地址,和网关????????? 如果设置成功,我能否在windows下 用ping 命令对运行中的vxworks进行网络连接??能ping通吗?? … 查看全部问答> |
|
MSP430 电容单触式传感器设计指南,这是官网应用手册,很权威的。 [ 本帖最后由 鑫海宝贝 于 2011-10-12 09:35 编辑 ]… 查看全部问答> |




