本文来源电子发烧友社区,作者:王琳, 帖子地址:https://bbs.elecfans.com/jishu_2251612_1_1.html
收到开发板之后,发现下载工具集成了串口调试助手,这个还是挺不错了。demo程序是查询方式实现串口打印。对于调试是没有问题的。但是如果串口用于MODBUS或者其他的一些应用,基本都是中断方式。
收到开发板之后,发现下载工具集成了串口调试助手,这个还是挺不错了。demo程序是查询方式实现串口打印。对于调试是没有问题的。但是如果串口用于MODBUS或者其他的一些应用,基本都是中断方式。
首先用中断方式的DEMO程序,似乎无法调通,于是用自己的方式调试串口。首先看看datasheet。居然只有四个寄存器,非常容易上手。
1.用下载工具提供的串口助手发送给MCU,MCU再把数据打印出来。
///----System Init --------------------------------------------------------------------------
CLIC_Init();//系统中断配置
System_clock_Init();//系统时钟初始化
SYS_Interrupt_Enable();//CLIC开总中断
此部分仍采用demo程序。
//初始化串口
UART_Init_IT_case1(UART2);//中断模式
做一些简单修改,使能接收
UARTx->CTRL = 0<<25 //发送中断使能: 0-off,1-on
|1<<24 //接收中断使能:0-off,1-on
|0x0116<<8 //波特率(对应16M时钟):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6 //模式选择:0-模式0,1-模式1,2/3-模式2
|0<<5 //多处理器使能
|1<<4 //接收使能
|0<<3 //发送数据bit8
|0<<2; //接收数据bit8
//写几行代码,处理发送和接收
发送数据:
void INE_vWriteData(uint8_t u8TxData)
{
uint32_t u32TempValue = 0;
u32TempValue = (1<< 25);
UART2->DATA = u8TxData;
UART2->CTRL = UART2->CTRL|u32TempValue;
}
先把数据放进寄存器,再使能发送
接收数据:
void UART1_IRQhandler(void)
{
uint32_t u32TempValue = 0;
uint32_t u32TempValue2 = 0;
uint8_t i = 0;
if(UART1->CTRL&0x1)//接收中断标志
{
//IRQ Hander......
INE_u8RecBuf[i++] = UART1->DATA;
//INE_u8RecBuf[0] = 2;
INE_u8Length = i;
//u32TempValue2 = (1<< 24);
///u32TempValue2 = ~u32TempValue;
//UART1->CTRL = UART1->CTRL&u32TempValue;
UART1->CTRL = (UART1->CTRL|0x01);//清除接收中断
}
if(UART1->CTRL&0x2)//发送中断标志
{
UART1->CTRL = (UART1->CTRL&0xfffffffe)|0x2;//清除发送中断
//IRQ Hander......
u32TempValue = (1<< 25);
u32TempValue = ~u32TempValue;
UART1->CTRL = UART1->CTRL&u32TempValue;
}
}
接收数据放在中断函数内部,同时清中断标志位。
对于发送来说,发送结束,同样清发送完成中断标志,并关闭发送使能位。
main函数打印数据
for (uint8_t i=0; i< INE_u8Length; i ++)
{
INE_vWriteData(INE_u8RecBuf); } INE_u8Length = 0;由于只想DEMO一下收发功能,所以支持收发一个字节。
CLIC_Init();//系统中断配置
System_clock_Init();//系统时钟初始化
SYS_Interrupt_Enable();//CLIC开总中断
此部分仍采用demo程序。
//初始化串口
UART_Init_IT_case1(UART2);//中断模式
做一些简单修改,使能接收
UARTx->CTRL = 0<<25 //发送中断使能: 0-off,1-on
|1<<24 //接收中断使能:0-off,1-on
|0x0116<<8 //波特率(对应16M时钟):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6 //模式选择:0-模式0,1-模式1,2/3-模式2
|0<<5 //多处理器使能
|1<<4 //接收使能
|0<<3 //发送数据bit8
|0<<2; //接收数据bit8
//写几行代码,处理发送和接收
发送数据:
void INE_vWriteData(uint8_t u8TxData)
{
uint32_t u32TempValue = 0;
u32TempValue = (1<< 25);
UART2->DATA = u8TxData;
UART2->CTRL = UART2->CTRL|u32TempValue;
}
先把数据放进寄存器,再使能发送
接收数据:
void UART1_IRQhandler(void)
{
uint32_t u32TempValue = 0;
uint32_t u32TempValue2 = 0;
uint8_t i = 0;
if(UART1->CTRL&0x1)//接收中断标志
{
//IRQ Hander......
INE_u8RecBuf[i++] = UART1->DATA;
//INE_u8RecBuf[0] = 2;
INE_u8Length = i;
//u32TempValue2 = (1<< 24);
///u32TempValue2 = ~u32TempValue;
//UART1->CTRL = UART1->CTRL&u32TempValue;
UART1->CTRL = (UART1->CTRL|0x01);//清除接收中断
}
if(UART1->CTRL&0x2)//发送中断标志
{
UART1->CTRL = (UART1->CTRL&0xfffffffe)|0x2;//清除发送中断
//IRQ Hander......
u32TempValue = (1<< 25);
u32TempValue = ~u32TempValue;
UART1->CTRL = UART1->CTRL&u32TempValue;
}
}
接收数据放在中断函数内部,同时清中断标志位。
对于发送来说,发送结束,同样清发送完成中断标志,并关闭发送使能位。
main函数打印数据
for (uint8_t i=0; i< INE_u8Length; i ++)
{
INE_vWriteData(INE_u8RecBuf); } INE_u8Length = 0;由于只想DEMO一下收发功能,所以支持收发一个字节。
2.切换到串口2,修改代码并用串口调试助手发送数据,打印数据。
总结:
1.串口寄存器简单易用,非常适合简单的应用场合。
2.同时datasheet过于简单,甚至找不到串口内部的逻辑图。
3.也正是由于过于简单,恐怕难以实现一些特殊的灵活应用。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
南京中科微
+关注
关注
0文章
60浏览量
740 -
CSM32RV20
+关注
关注
0文章
40浏览量
206
发布评论请先 登录
相关推荐
追加名额丨米尔瑞芯微RK3576开发板有奖试用
米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动加码啦~~米尔追加了2块价值849元的MYD-LR3576
常用在工业控制系统上的MCU芯片资料:CSM32RV20
CSM32RV20是一款基于RISC-V核的低功耗MCU芯片。 内置RISC-V RV32IMAC内核(2.6CoreMark/MHz); 蕞高32MHz工作频率; 内置4kB的SRAM; 内置8B
有奖丨米尔 瑞芯微RK3576开发板免费试用
米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动来啦~~米尔提供了7块价值849元的MYD-LR3576
全志A133开发板安卓系统调试串口复用成普通串口方法-触觉智能EVB1309
本文介绍了在开发板/主板串口接口不够的情况下,可将调试串口改为普通串口使用。基于触觉智能的全志A133开发板(型号EVB1309)演示,该主
点击参与米尔NXP i.MX 93开发板有奖试用
米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了3块价值678元的MYD-LMX9X开发板发起试用活动您不仅可以免费体
求助,关于串口中断问题求解
串口中断问题
int main (void)
{
I2C_EE_Init();
/* 串口1初始化 */
USART1_Config();
NVIC_Configuration();
while
发表于 05-15 06:55
用stm32cubemx的串口中断接收时,过一段时间串口中断不进了怎么解决?
个小时多串口中断进不去了,我用两根线挂在总线上在电脑上用串口助手监听收发的数据,发送和应答的过程还在持续,其他功能也都正常只是cubemx的程序认为没有收到数据。很难定位是哪里的问题。
发表于 04-17 06:48
香橙派发布首款RISC-V开发板OrangePi RV
2024年3月,香橙派在全球开发者会议上发布了其首款基于RISC-V开发的OrangePi RV主板。这款开发板拥有四核RISC-V U74与S7协处理器,配备 2MB L2缓存。同时
评论