STM32f103的数电采集电路的USART的使用与蓝牙的连接的程序
扫描二维码
随时随地手机看文章
STM32的串口资源相当丰富的,功能也相当强劲。本项目所使用的STM32F103C8T6最多可提供3路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。
串口设置的一般步骤可以总结为如下几个步骤:
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