環境:
主機:WIN7
開發環境:MDK4.23
功能:
打開Android手機或者平台的藍牙,通過藍牙連接藍牙轉串口板,通過藍牙轉串口板的串口與需要調試的串口設備相連
說明:
1.PCB為我同學hunter繪制,他同時是stm32的高手,感謝他提供的支持.
2.制作了一個藍牙轉串口的板子,Android設備連接上這個板子,就相當於增加了一個串口.
3.單片機選用的是STM32F101C8,藍牙模塊選用的是HC05.HC05本身就是一個藍牙轉串口模塊,再增加一個單片機的作用是可以通過單片機來配置波特率等參數.
4.藍牙轉串口板可以用MINI USB來供電,或者用3.7V锂電池來供電,板子上帶有充電管理芯片,由於沒锂電池,充電這塊還沒有測試.
5.上位機程序(Android上的串口助手)暫時沒有時間寫,可以在安卓市場上搜索"藍牙串口"下一個串口助手.
實物圖:
電路圖:
第1部分:
圖片較大,部分沒有顯示.可以在新窗口打開圖片來看到全部內容
第2部分:
下位機程序:
public.h
- #ifndef _PUBLIC_H_
- #define _PUBLIC_H_
-
- //公共頭文件
- #include "main.h"
- #include "string.h"
- #include "stdlib.h"
- #include "stm32f10x_tim.h"
-
- //宏定義
- #define U8 unsigned char
- #define U16 unsigned short
- #define U32 unsigned long
-
- //藍牙轉串口的緩存長度
- #define LEN_BT_STACK 10
-
- //藍牙波特率設置命令
- #define BT_BAUD_4800 "AT+UART=4800,0,0"
- #define BT_BAUD_9600 "AT+UART=9600,0,0"
- #define BT_BAUD_19200 "AT+UART=19200,0,0"
- #define BT_BAUD_38400 "AT+UART=38400,0,0"
- #define BT_BAUD_57600 "AT+UART=57600,0,0"
- #define BT_BAUD_115200 "AT+UART=115200,0,0"
- #define DEFAULT_BAUD 9600
-
- //定義flash頁大小
- #if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || (STM32F10X_CL) || defined (STM32F10X_XL)
- #define FLASH_PAGE_SIZE ((uint16_t)0x800)
- #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages12to13 | FLASH_WRProt_Pages14to15)
- #else
- #define FLASH_PAGE_SIZE ((uint16_t)0x400)
- //需要關閉寫保護的頁面
- #define FLASH_PAGES_TO_BE_PROTECTED (FLASH_WRProt_Pages60to63)
- #endif
-
- //定義操作的flash的始末地址63K-64K
- #define BANK1_WRITE_START_ADDR ((uint32_t)0x0800FC00)
- #define BANK1_WRITE_END_ADDR ((uint32_t)0x08010000)
-
- //數據結構
-
- //通過藍牙發過來的串口2的數據堆棧
- //數據結構為循環隊列,讀寫緩沖
- #define LEN_BUF 512
- struct _FIFO_Stack
- {
- unsigned char buf[LEN_BUF];
- short ptr_r;
- short ptr_w;
- };
-
- //數據流式符合字符串頭檢索
- #define LEN_MATCH_STRING_HEADER 9
- struct _match_string_header
- {
- char match[LEN_MATCH_STRING_HEADER];
- int state;
- };
-
- //數據流式符合字符串尾檢索,並提取數據結構
- #define LEN_MATCH_STRING_TAIL 3
- struct _match_string_tail
- {
- char match[LEN_MATCH_STRING_TAIL];
- int state; //當前狀態/下標
- int value; //最後取得的值
- int max_len; //數據最大長度
- char capture_string[10];
- int capture_index; //當前捕獲數據下標
- struct _match_string_header match_string_header; //用來比較尾是否正確
- int flag; //捕獲數據狀態或是捕獲字符尾狀態
- };
-
- //修改flash
- struct _edit_flash
- {
- unsigned short buf[512];
- int flag; //判斷flash是否被修改過
- int baud; //需要寫入/讀出的波特率
- };
-
- //公共變量
- //聲明串口結構體
- extern USART_InitTypeDef USART_InitStructure;
-
- //聲明FIFO堆棧給UART2使用
- extern struct _FIFO_Stack fifo_uart2;
-
- //聲明FIFO堆棧給UART1使用
- extern struct _FIFO_Stack fifo_uart1;
-
- //聲明修改flash結構體
- extern struct _edit_flash edit_flash;
-
- //公共函數
- //按照藍牙轉串口的格式發送指令
- void send_bt_cmd(char *str);
-
- //循環緩沖方法
- //初始化
- void init_fifo_stack(struct _FIFO_Stack *stack);
- //讀取全部
- //成功返回字節數,失敗返回-1
- short read_all_fifo_stack(struct _FIFO_Stack *stack,unsigned char *buf);
- //寫入1個字節
- //失敗返回-1,成功返回1
- int write_byte_fifo_stack(struct _FIFO_Stack *stack,unsigned char byte);
-
- //數據流式符合字符串頭檢索方法
- //初始化
- //成功返回1,失敗返回0
- int init_match_string_header(struct _match_string_header *m_str,char *buf);
- //返回-1失敗,返回0正在運行,返回1成功
- int match_string_header_state(struct _match_string_header *m_str,char ch);
-
- //數據流式符合字符串尾檢索,並提取數據結構方法
- //初始化
- //成功返回1,失敗返回0
- int init_match_string_tail(struct _match_string_tail *m_str,char *buf,int max_len);
- //返回-1失敗,返回0正在運行,成功返回得到的數據
- int match_string_tail_state(struct _match_string_tail *m_str,char ch);
-
- //flash操作
- //打開需要操作頁面的寫保護
- void open_write_lock();
- //向flash中寫入數據,1024字節,512個半字
- //成功返回寫入的字節數,失敗返回-1
- int write_flash(unsigned short *buf);
- //讀取flash,讀取1024字節,512半字
- //成功返回讀取的字節數,失敗返回-1
- int read_flash(unsigned short *buf);
-
- //讀取flash,獲得flag和baud
- //成功返回波特率,失敗返回-1
- int read_baud(struct _edit_flash *edit);
- //寫入波特率到flash
- //成功返回1,失敗返回0
- int write_baud(struct _edit_flash *edit,int baud);
-
- #endif