安卓手機與藍芽模組聯合除錯(二)—— 微控制器藍芽控制LED燈亮滅(上)
阿新 • • 發佈:2019-01-31
系列博文:
忙裡偷閒,承接上一篇文章繼續
本篇將實現兩個例項,手頭正好有8位的微控制器,索性就用來練手了。將會提供兩個例子,一個是基於STM8的庫函式例項,一個是基於STC89C52的例項。
1.首先了解下微控制器串列埠通訊線的接法。這個比較重要,建議參考文章。
(1)HC-05初探 - 騎著蝸牛逛世界 - 部落格園 https://www.cnblogs.com/LittleHann/p/5621937.html
(2)HC-05 藍芽模組的除錯與使用 - CSDN部落格 https://blog.csdn.net/txf1984/article/details/46553715
2. 準備工作和微控制器原理圖。
首先看下我用到的硬體支援,一塊STM8S103F2P6最小系統板,一個ST-Link下載器,一個HC-05的模組(暫時先除錯HC-5的模組,CC2541微控制器端的程式碼是一樣的)
最小系統的原理圖如下,大家按照上面兩個博文中的接線方法接好微控制器,特別注意藍芽模組的TX/RX與微控制器的TX/RX要交叉相接。
3. 微控制器的程式碼,使用STM8庫函式編寫。
首先看下目錄結構,本專案使用的是IAR編譯器
下面貼出來main函式,註釋在程式碼中已經描述的很清楚了,大家可以自行參考。
/************* ** Author : 江濤 ** Date : 2018/08/28 ** Describe : 藍芽控制微控制器開關燈 **************/ /* Includes -----------*/ #include "stm8s.h" #include <string.h> /******************************************** ** TestLed PB5 測試LED **********************************************/ /**串列埠1接收資料標誌位**/ unsigned char Usart1_bufStart_or_bufSotp = 0 ; /**串列埠1資料,這裡10個位元組夠放命令了,大家可以根據實際需要調整陣列長度**/ char Usart1BufData[10]; /**串列埠資料數目自增量,用來統計數目是否達到陣列最大長度**/ char Usart1BufConst; /****以下是定義的命令*****/ char LED_ON[10] = "ON\n"; char LED_OFF[10] = "OFF\n"; void Delay(uint16_t nCount) { /* Decrement nCount value */ while (nCount != 0) { nCount--; } } /************* * 初始化串列埠UART1 **************/ void initUart1() { // 串列埠設定 UART1_DeInit(); // 9600波特率,8位資料位,一位停止位, UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);//UART1_MODE_TX_ENABLE); // 使能串列埠接收中斷 UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); } /********* * 埠配置 **************/ void initGPIO(){ // LED燈的GPIO口初始化 GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(GPIOB , GPIO_PIN_5); // 關測試燈 } /***************** * 程式入口 *******************/ void main(void) { // 初始化系統時鐘, CLK_HSICmd(ENABLE); CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); //內部時鐘16M,8分頻 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8); initGPIO(); initUart1(); enableInterrupts(); // 使能中斷 while (1) { if(Usart1_bufStart_or_bufSotp) { Usart1_bufStart_or_bufSotp = 0 ; if(strcmp(Usart1BufData,LED_ON)==0) { GPIO_WriteLow(GPIOB , GPIO_PIN_5); } else if(strcmp(Usart1BufData,LED_OFF)==0) { GPIO_WriteHigh(GPIOB , GPIO_PIN_5); } Usart1BufConst = 0 ; memset(Usart1BufData,0,10);//清0陣列 } } } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval : None */ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif
專案中還有個it.c檔案,內容如下:
/* Includes ------------------------------------------------------------------*/ #include "stm8s.h" /* Private typedef -----------------------------------------------------------*/ extern unsigned char Usart1_bufStart_or_bufSotp; extern char Usart1BufData[10]; extern char Usart1BufConst; /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /* Public functions ----------------------------------------------------------*/ #if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \ defined(STM8S003) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903) /** * @brief UART1 TX Interrupt routine. * @param None * @retval None */ INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ } /** * @brief UART1 RX Interrupt routine. * @param None * @retval None */ INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ Usart1BufData[Usart1BufConst]=UART1_ReceiveData8(); UART1_SendData8(UART1_ReceiveData8()); // 收到了結束符號 if(Usart1BufData[Usart1BufConst]==0x0A) { Usart1_bufStart_or_bufSotp=1; } else Usart1BufConst++; UART1_ClearITPendingBit(UART1_IT_RXNE); // 清除標誌位 } #endif /*STM8S208 or STM8S207 or STM8S103 or STM8S903 or STM8AF62Ax or STM8AF52Ax */ /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
主要程式碼就是這些了,註釋中已經寫的很清楚了。
4.接好線看下執行的效果 。
過後放上一個視訊連線,實在因為gif的效果不明顯。
好了,STM8藍芽控制LED亮滅的功能基本實現了,下一遍將實現藍芽和STC89微控制器的聯調。
當這個系列結束之後我會將程式碼一併上傳到Git。博文更新的話,可能因為工作原因會斷斷續續,希望大家見諒。如果覺得有幫助或者有設麼其他好的建議可以在博文下留言,讚賞碼沒有別的意思,這是個知識付費的時代,可能付費了才會更珍惜學習的不易,當然也是作者創作的動力所在,哈哈。