• SWM32系列教程4-端口映射及串口应用


    837241be937641298b6875f8c3c43dff.jpeg

    今天来介绍一下SWM32单片机的端口映射和串口的应用。

    1.端口映射

    之前的文章中介绍过,SWM32系列单片机的端口映射比较灵活。一个外设可以映射到多个不同的GPIO,对于PCB布线来说,就方便很多。

    可以通过PORTx_SEL寄存器来配置某个外设映射到哪个端口。如下图:

    9f11a56e21afeae444847099ef0e8d15.png

    以PC口为例,PC0可以配置PORTC_SEL寄存器,映射为FUNMUX0功能,PC1可以映射为FUNMUX1功能,而FUNMUX0和FUNMUX1功能又可以对应不同的外设。因此PC0和PC1就可以灵活的配置为各种数字外设的功能。

    89300bcb2134c5597d1d450e9f1d477f.png

    但这个也不是无限灵活的,一般遵循奇偶分配的原则,即偶数端口对应FUNMUX0功能,奇数端口对应FUNMUX1功能。

    实际编程时,直接调用相关的函数即可,以串口为例,要将UART0功能映射到PC2和PC3端口,调用以下函数即可。函数具体的参数说明可以看注释。

    1. PORT_Init(PORTC, PIN2, FUNMUX0_UART0_RXD, 1); //GPIOC.2配置为UART0输入引脚
    2. PORT_Init(PORTC, PIN3, FUNMUX1_UART0_TXD, 0); //GPIOC.3配置为UART0输出引脚

    2.串口应用

    串口(UART)是嵌入式中最常用的接口之一。该单片机的UART口,拥有深度为8的收发FIFO,可以减少 CPU 中断的频率,提高运行效率。

    一般情况下,我们都是采用中断的方式来收发数据,这里也主要介绍怎样实现中断方式收发数据。直接看程序:

    1. void SerialInit(void)
    2. {
    3. UART_InitStructure UART_initStruct;
    4. PORT_Init(PORTC, PIN2, FUNMUX0_UART0_RXD, 1); //GPIOC.2配置为UART0输入引脚
    5. PORT_Init(PORTC, PIN3, FUNMUX1_UART0_TXD, 0); //GPIOC.3配置为UART0输出引脚
    6. UART_initStruct.Baudrate = 115200;
    7. UART_initStruct.DataBits = UART_DATA_8BIT;
    8. UART_initStruct.Parity = UART_PARITY_NONE;
    9. UART_initStruct.StopBits = UART_STOP_1BIT;
    10.        UART_initStruct.RXThreshold = 3;           //接收FIFO门限设置
    11.        UART_initStruct.RXThresholdIEn = 1;        //使能接收中断
    12.        UART_initStruct.TXThreshold = 3;           //发送FIFO门限设置
    13.        UART_initStruct.TXThresholdIEn = 0;        //发送中断
    14.        UART_initStruct.TimeoutTime = 10;          //10个字符时间内未接收到新的数据则触发超时中断
    15.        UART_initStruct.TimeoutIEn = 1;            //使能超时中断
    16. UART_Init(UART0, &UART_initStruct);
    17. UART_Open(UART0);
    18.        NVIC_EnableIRQ(UART0_IRQn);               //打开串口中断
    19. }

    波特率及数据位、校验位等设置不必多说,主要看后面的中断部分的设置。

    接收和超时中断

    首先需要设置接收FIFO门限RXThreshold, 同时RXThresholdIEn=1使能接收中断。当接收FIFO中的数据个数>RXThreshold时产生接收中断。不像其他不带FIFO的单片机,接收一个字节就产生一次中断。

    其次,还需设置接收超时时间TimeoutTime,以及使能超时中断TimeoutIEn=1。当FIFO中数据≤RXThreshold时,且超时未接收到新数据,会产生超时中断。两个中断配合即可完成一帧数据的读取。

    发送和发送完成中断

    发送中断与接收中断类似,也需要设置FIFO门限TXThreshold以及使能中断TXThresholdIEn=1。需要注意的是初始化时不必使能中断,在需要发数据时使能即可。

    数据发送完成后,可以再使能发送完成中断,发送完成中断在485半双工应用时很有用。

    完整的工程参考:

    链接:https://pan.baidu.com/s/1KLbtE_FP1ZPY5UqlZwdY9Q?pwd=5ij6

    提取码:5ij6

    推荐阅读:

    SWM32系列教程1-了解一下硬件

    UART波特率对时钟精度的要求有多高?

    PCB大电流设计方法简介

    让蜂鸣器唱个歌~《像我这样的人》

       欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

  • 相关阅读:
    (十五)VBA常用基础知识:正则表达式的使用
    天黑了、让我为你关窗帘吧
    个人记账实用方法
    在 SQL Server 中,可以使用内置函数 NEWID() 来生成一个随机的 GUID(全局唯一标识符)。可以将此 GUID 作为字符串拼接到查询结果中。
    ATF问题二则:EL3可能没有实现吗?&& aarch32中的S-EL1是什么?
    狂神说多线程学习笔记
    电脑监控系统,实现可视化管理!
    搭建Spark开发环境(第二弹)
    Python中四个不常见的小技巧
    python学习 数据分析模块pandas
  • 原文地址:https://blog.csdn.net/zhang062061/article/details/125568146