首页 >  应用 >  单片机应用
[导读]STM32的串口资源相当丰富的,功能也相当强劲。本项目所使用的STM32F103C8T6最多可提供3路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范

的串口资源相当丰富的,功能也相当强劲。本项目所使用的STM32F103C8T6最多可提供3路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。

本文引用地址: http://www.wzshuangkang.com/app/mcu/201811/781315.htm

串口设置的一般步骤可以总结为如下几个步骤:

1.串口时钟使能,GPIO时钟使能

2.串口复位

3.GPIO端口模式设置

4.串口参数初始化

5.开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

6.使能串口

7.编写中断处理函数

HC-05电子游戏网站蓝牙串口通讯模块(以下简称模块)具有两种工作模式:命令响应工作模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有AT命令,用户可向模块发送各种AT指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚输入电平,可以实现模块工作状态的动态转换。

前端采集模块使用了STM32F103C8T6的USART1串口通路,采用115200的波特率,数据位8位,1位停止位,无校验位,作为串口配置协议。HC-05蓝牙模块使用从机(Slave)模式,并用AT指令设置串口配置协议。蓝牙作为无线传输方式,是和安卓智能手机通信的一种简单快捷的通信方式,USART串口作为单片机与蓝牙芯片之间通信的方式。

蓝牙通信协议报文格式详情见3.2.6第4条。这样的通信协议充分利用了单片机内核的移位运算器,比如数据的第0位SendBuff[0]=HexTable[(adcValue>>12)&0x0f];同时稳定性极高,即使在数据传输途中某一位的数据出错或者丢失,只要上位机识别报文标识字符,之后的数据还是可以准确的读取,保证了数据传输的高效。而且保证了数据的可靠性,经过测试,系统连续运行3小时,可以实现0出错,错误的数据自动抛弃。


USART1使用DMA发送配置和接收中断代码


voiduart_init(u32bound){

//GPIO端口设置

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA时钟

USART_DeInit(USART1);//复位串口1

//USART1_TXPA.9

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9

//USART1_RXPA.10

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA10

//Usart1NVIC配置

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

//USART初始化设置

USART_InitStructure.USART_BaudRate=bound;//一般设置为9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits=USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式

USART_Init(USART1,&USART_InitStructure);//初始化串口

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收寄存器满开启中断

USART_Cmd(USART1,ENABLE);//使能串口

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

}

voidUSART1_IRQHandler(void)//串口1中断服务程序

{

uint8_tRes=0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断(接收寄存器满中断)

{

Res=USART_ReceiveData(USART1);//(USART1->DR);//读取接收到的数据

}

if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)//接收中断(发送寄存器空中断)

{

}

}


这里使用USART的DMA发送,同时使用接收中断。其中Res是接收到的数据。DMA配置详情请参考http://blog.csdn.net/devintt/article/details/46998173