正点原子ATK-LORA-01无线串口代码移植+STM32F103C8T6(标准库)
目錄
一、ATK-LORA-01無線串口資料
二、代碼移植
1.分析
(1)usart3(也可以是其他的串口)用于接收數據的串口
usart.h
(2)time3(也可以是其他的定時器)用于時序的設置
(3)lora.c
三、演示
1.主機(發送方)
(1)主機接線
(2)主機代碼(發送方)
(3)主機實物
?插上無線串口通電即可發送?
?2.從機(接收方)
(1)從機接線(LORA與主機相同)
?(2)從機代碼(接收方)
(3)從機實物
接上TTL和LORA并通電即可用
??
?3.串口顯示結果(從機串口1接的串口助手)
?4.注意
(1)接收數據的函數與發送數據的函數不能同時燒錄,只能實現接收和發送二者之一的功能,若要在接收的基礎上返送可以寫一個按鍵掃描,當按鍵按下發送,沒按下一直處于接收狀態,此時就可以同時存在,但是不能連續發送(可能還得優化!)。
?(2)發送時必須有延時函數,不然接收會出現亂碼!
一、ATK-LORA-01無線串口資料
該資料為正點原子提供的資料,也可以去正點原子的官網下載資料,這里只是方便大家資料提取
鏈接:https://pan.baidu.com/s/11WQbh1tCQIu54zZDEiqmew?
提取碼:tsy6?
--來自百度網盤超級會員V4的分享
本人自己移植后的工程:
鏈接:https://pan.baidu.com/s/15S6a3le2xYR56GH5qRscDg?
提取碼:tsy6?
--來自百度網盤超級會員V4的分享
二、代碼移植
1.分析
移植前首先需要創建的片上外設為:
(1)usart3(也可以是其他的串口)用于接收數據的串口
usart3.c
/**************** 1、串口時鐘、GPIOA時鐘使能 2、GPIOA端口模式設置 3、串口參數初始化 4、開啟中斷并且初始化NVIC 5、使能串口 6、編寫中斷處理函數 ******************/ #include "sys.h" //包含需要的頭文件extern u8 Lora_mode; //串口接收緩存區 u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收緩沖,最大USART3_MAX_RECV_LEN個字節. u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //發送緩沖,最大USART3_MAX_SEND_LEN字節//通過判斷接收連續2個字符之間的時間差不大于10ms來決定是不是一次連續的數據. //如果2個字符接收間隔超過timer,則認為不是1次連續數據.也就是超過timer沒有接收到 //任何數據,則表示此次接收完畢. //接收到的數據狀態 //[15]:0,沒有接收到數據;1,接收到了一批數據. //[14:0]:接收到的數據長度 vu16 USART3_RX_STA=0; void USART3_IRQHandler(void) {u8 res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到數據{ res =USART_ReceiveData(USART3); if((USART3_RX_STA&(1<<15))==0) //接收完的一批數據,還沒有被處理,則不再接收其他數據{ if(USART3_RX_STA<USART3_MAX_RECV_LEN) //還可以接收數據{ if(!Lora_mode)//配置功能下(啟動定時器超時){TIM_SetCounter(TIM7,0); //計數器清空 if(USART3_RX_STA==0) //使能定時器7的中斷 {TIM_Cmd(TIM7,ENABLE); //使能定時器7}}USART3_RX_BUF[USART3_RX_STA++]=res; //記錄接收到的值 }else {USART3_RX_STA|=1<<15; //強制標記接收完成} }} } USART_InitTypeDef USART_InitStructure; //初始化IO 串口3 //pclk1:PCLK1時鐘頻率(Mhz) //bound:波特率 void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3時鐘使能USART_DeInit(USART3); //復位串口3//USART3_TX PB10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10//USART3_RX PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11USART_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(USART3, &USART_InitStructure); //初始化串口3USART_Cmd(USART3, ENABLE); //使能串口 //使能接收中斷USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟中斷 //設置中斷優先級NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器TIM3_Init(99,7199); //10ms中斷USART3_RX_STA=0; //清零TIM_Cmd(TIM3,DISABLE); //關閉定時器7 }//串口3,printf 函數 //確保一次發送數據不超過USART3_MAX_SEND_LEN字節 void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt);vsprintf((char*)USART3_TX_BUF,fmt,ap);va_end(ap);i=strlen((const char*)USART3_TX_BUF); //此次發送數據的長度for(j=0;j<i;j++) //循環發送數據{while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環發送,直到發送完畢 USART_SendData(USART3,USART3_TX_BUF[j]); } }//串口接收使能控制 //enable:0,關閉 1,打開 void usart3_rx(u8 enable) {USART_Cmd(USART3, DISABLE); //失能串口 if(enable){USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式}else{USART_InitStructure.USART_Mode = USART_Mode_Tx;//只發送 }USART_Init(USART3, &USART_InitStructure); //初始化串口3USART_Cmd(USART3, ENABLE); //使能串口 }usart.h
#ifndef __USART3_H #define __USART3_H #include "sys.h"#define USART3_MAX_RECV_LEN 1024 //最大接收緩存字節數 #define USART3_MAX_SEND_LEN 600 //最大發送緩存字節數 #define USART3_RX_EN 1 //0,不接收;1,接收.extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收緩沖,最大USART3_MAX_RECV_LEN字節 extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //發送緩沖,最大USART3_MAX_SEND_LEN字節 extern vu16 USART3_RX_STA; //接收數據狀態void usart3_init(u32 bound); //串口2初始化 void usart3_set(u8 bps,u8 parity); void usart3_rx(u8 enable); void u3_printf(char* fmt,...);#endif(2)time3(也可以是其他的定時器)用于時序的設置
time3的中斷服務函數需要添加如下:
(3)lora.c
發送數據(相當的簡單)
????????發送什么數據調sprintf()就完了注意:這里的temp[100],是為sprintf()發送字符串創造一個空間,temp數組的長度可以根據發送數據的長度來定。
接收數據(相當好用)
三、演示
1.主機(發送方)
(1)主機接線
(2)主機代碼(發送方)
(3)主機實物
?插上無線串口通電即可發送
?2.從機(接收方)
(1)從機接線(LORA與主機相同)
TTL轉USP接線
?(2)從機代碼(接收方)
(3)從機實物
接上TTL和LORA并通電即可用
?
?3.串口顯示結果(從機串口1接的串口助手)
?4.注意
(1)接收數據的函數與發送數據的函數不能同時燒錄,只能實現接收和發送二者之一的功能,若要在接收的基礎上返送可以寫一個按鍵掃描,當按鍵按下發送,沒按下一直處于接收狀態,此時就可以同時存在,但是不能連續發送(可能還得優化!)。
如下:
?(2)發送時必須有延時函數,不然接收會出現亂碼!
總結
以上是生活随笔為你收集整理的正点原子ATK-LORA-01无线串口代码移植+STM32F103C8T6(标准库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像特效---LOMO Filter
- 下一篇: Alpha测试 / Beta测试 / 黑