STM32f103的数电采集电路的USART的使用与蓝牙的连接的程序

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

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

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

2.串口复位

3.GPIO 端口模式设置

4.串口参数初始化

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

6.使能串口

7.编写中断处理函数

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

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

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


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

void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
 	USART_DeInit(USART1);  //复位串口1
	//USART1_TX   PA.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_RX	  PA.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

 //Usart1 NVIC 配置

	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);
}

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	uint8_t Res = 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

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是基于STM32F103C8T6的USART通信程序示例,其中使用USART1作为示例: ```c #include "stm32f10x.h" void USART1_Init(void); void USART1_SendChar(char ch); void USART1_SendString(char* str); int main(void) { USART1_Init(); while(1) { USART1_SendString("Hello World!\r\n"); delay_ms(1000); } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, (uint16_t)ch); } void USART1_SendString(char* str) { while (*str) { USART1_SendChar(*str++); } } ``` 这个程序初始化了USART1,设置了波特率为115200,发送"Hello World!"字符串并延时1秒钟。 请注意,这只是一个简单的示例程序,实际应用中需要根据具体情况进行修改和优化。同时还需要使用外部的串口调试工具进行通信测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值