1. 程式人生 > >STM32f103的數電採集電路的USART的使用與藍芽的連線的程式

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