【南京中科微CSM32RV20开发板试用体验】串口中断收发

描述

本文来源电子发烧友社区,作者:王琳, 帖子地址:https://bbs.elecfans.com/jishu_2251612_1_1.html

收到
开发板之后,发现下载工具集成了串口调试助手,这个还是挺不错了。demo程序是查询方式实现串口打印。对于调试是没有问题的。但是如果串口用于MODBUS或者其他的一些应用,基本都是中断方式。      
       首先用中断方式的DEMO程序,似乎无法调通,于是用自己的方式调试串口。首先看看datasheet。居然只有四个寄存器,非常容易上手。
 
CSM32RV20
 
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一下收发功能,所以支持收发一个字节。
 
CSM32RV20
 
 
2. 切换到串口2,修改代码并用串口调试助手发送数据,打印数据。
CSM32RV20
 

CSM32RV20
 
 
 
总结:
1. 串口寄存器简单易用,非常适合简单的应用场合。
2. 同时datasheet过于简单,甚至找不到串口内部的逻辑图。
3. 也正是由于过于简单,恐怕难以实现一些特殊的灵活应用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分