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端口,调用以下函数即可。函数具体的参数说明可以看注释。

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

2.串口应用

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

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

void SerialInit(void)
{
       UART_InitStructure UART_initStruct;


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


        UART_initStruct.Baudrate = 115200;
       UART_initStruct.DataBits = UART_DATA_8BIT;
       UART_initStruct.Parity = UART_PARITY_NONE;
       UART_initStruct.StopBits = UART_STOP_1BIT;
       UART_initStruct.RXThreshold = 3;           //接收FIFO门限设置
       UART_initStruct.RXThresholdIEn = 1;        //使能接收中断
       UART_initStruct.TXThreshold = 3;           //发送FIFO门限设置
       UART_initStruct.TXThresholdIEn = 0;        //发送中断
       UART_initStruct.TimeoutTime = 10;          //10个字符时间内未接收到新的数据则触发超时中断
       UART_initStruct.TimeoutIEn = 1;            //使能超时中断
        UART_Init(UART0, &UART_initStruct);
       UART_Open(UART0);


       NVIC_EnableIRQ(UART0_IRQn);               //打开串口中断
}

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

接收和超时中断

首先需要设置接收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大电流设计方法简介

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值