實(shí)驗(yàn)簡(jiǎn)介
基于STM32F103C8T6的E01系列(nRF24L01P)和E01C系列(SI24R1)的EBYTE官網(wǎng)例程移植。EBYTE官網(wǎng)例程是基于STM8L151編寫(xiě),本次實(shí)驗(yàn)的目的是將該例程移植到常見(jiàn)的MCU型號(hào)STM32F103C8T6,實(shí)現(xiàn)基本的無(wú)線通信。電腦端的串口調(diào)試助手操作和顯示數(shù)據(jù)收發(fā)。(可以稍加修改,適用于其他STM32系列的MCU)
硬件環(huán)境
? 2個(gè)E01系列的相同型號(hào)的模塊(或者2個(gè)E01C系列的相同型號(hào)的模塊)
? 2個(gè)USB轉(zhuǎn)TTL模塊(CH340版本)
? 2個(gè)STM32F103C8T6最小系統(tǒng)板
? 1個(gè)STM32燒錄器(DAP-LINK或者ST-LINK等等)
? 1臺(tái)電腦
? 杜邦線若干
軟件環(huán)境
? STM32的開(kāi)發(fā)軟件(MDK_ARM,IAR或者STM32CubeIDE等等)
? STM32CubeMX
? XCOM V2.6 串口調(diào)試助手
? CH340驅(qū)動(dòng)
模塊簡(jiǎn)介
視選擇型號(hào),參考廠家提供的模塊手冊(cè)。因?yàn)镋01和E01C分別使用的nRF24L01P和SI24R1射頻方案,但是寄存器基本一致,操作方式也大致相同,所以驅(qū)動(dòng)程序可以通用。
本次實(shí)驗(yàn)使用E01-ML01D,基于nRF24L01P方案,3.3V供電,最大發(fā)射功率0dBm,參考通信距離100m。模塊的寄存器和詳細(xì)操作可以直接參考nRF24L01P的芯片手冊(cè)。E01-ML01D模塊示意及引腳定義如下圖。
實(shí)驗(yàn)步驟
本次實(shí)驗(yàn)使用的STM32開(kāi)發(fā)環(huán)境是MDK_ARM和STM32CubeMX,燒錄器使用的是ST-LINK。涉及到的軟件獲取和安裝方法這里不做介紹,建議參考網(wǎng)上的教程。注意,如果使用的大功率E01或者E01C模塊,例如發(fā)射功率大于等于20dBm,需要考慮供電是否達(dá)到要求,本次使用的是E01-ML01D的發(fā)射電流在13mA,一般的STM32F103C8T6核心板都可以滿足要求。
1.準(zhǔn)備EBYTE官網(wǎng)例程
在億佰特官網(wǎng)搜索E01-ML01D,在【相關(guān)下載】一欄,找到通信例程并下載解壓。
2.新建STM32工程
①打開(kāi)STM32CubeMX,新建STM32F103C8T6工程,進(jìn)入MCU配置。
②配置System Core選項(xiàng)中的SYS和RCC
在Pinout & Configuration 一欄下展開(kāi)System Core,分別配置SYS和RCC。
③Clock Configuration時(shí)鐘樹(shù)配置
時(shí)鐘配置完成后,回到Pinout & Configuration一欄配置其他MCU外設(shè)。
④MCU的串口配置
選擇USART1,配置USART1參數(shù)。
開(kāi)啟USART1全局中斷。
⑤配置MCU的SPI
選擇SPI1,配置為全雙工主機(jī)模式,射頻芯片的SPI速率最大支持10M,所以MCU的SPI的速率要小于等于10M,CPOL選擇Low,CPHA選擇1Edge,NSS引腳控制選擇Software。不啟用SPI1的全局中斷,所以NVIC Setting不設(shè)置。
⑥GPIO配置
直接點(diǎn)擊MCU對(duì)應(yīng)引腳,將其配置。將PA4作為SPI1的片選引腳,PB0作為E01-ML01D模塊的CE引腳,PB1作為E01-ML01D模塊的IRQ引腳。所以需要把PA4和 PB0 配置為GPIO_Output,PB1配置為GPIO_Input。配置引腳后,在GPIO選項(xiàng)中,會(huì)顯示配置的這三個(gè)引腳配置詳情。然后在GPIO選項(xiàng)中,需要配置GPIO的其他參數(shù)。
這一步完成后,我們要使用的MCU外設(shè)已經(jīng)基本完成配置,接下來(lái)是工程的設(shè)置和保存。
⑦設(shè)置工程以及保存路徑
配置工程及代碼生成配置,最后點(diǎn)擊GENERATE CODE,等待進(jìn)度條完成后會(huì)出現(xiàn)一個(gè)彈窗,選擇Open Project 直接打開(kāi)工程。接下來(lái)就是在MDK_ARM中的操作。
3.代碼移植
①完成上面的步驟后,已經(jīng)打開(kāi)了創(chuàng)建的工程,先進(jìn)行首次編譯,查看是否有編譯錯(cuò)誤。
正常的編譯結(jié)果應(yīng)該是0 Error(s),0 Warning(s)。
②實(shí)現(xiàn)串口重定向,修改usart.c和usart.h文件
usart.c中修改兩個(gè)位置。
一個(gè)是在/* USER CODE BEGIN 0 */和/* USER CODE END 0 */之間新添加如下代碼:
/* USER CODE BEGIN 0 */
uint8_t uart_rx_data = 0;//串口中斷接收的數(shù)據(jù)存儲(chǔ)
int fputc(int ch, FILE *f){ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch;}/* USER CODE END 0 */
另一個(gè)是修改void MX_USART1_UART_Init(void)函數(shù),在該函數(shù)中的
/* USER CODE BEGIN USART1_Init 2 */和 /* USER CODE END USART1_Init 2 */之間加入代碼:
void MX_USART1_UART_Init(void){
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */
huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ HAL_UART_Receive_IT(&huart1,&uart_rx_data,1);//開(kāi)啟接收中斷 /* USER CODE END USART1_Init 2 */
}
Usart.h中,需要包含stdio.h,在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */之間加入代碼:
/* USER CODE BEGIN Includes */#include "stdio.h"/* USER CODE END Includes */
Usart.h中,在/* USER CODE BEGIN Private defines */和/* USER CODE END Private defines */之間加入代碼:
/* USER CODE BEGIN Private defines */extern uint8_t uart_rx_data;/* USER CODE END Private defines */
啟用MicroLIB
③在創(chuàng)建的工程路徑下,新建一個(gè)名為MyFiles的文件夾,并將例程中的如下文件均復(fù)制到MyFiles文件夾中。
④添加MyFiles的文件夾路徑到工程。
⑤在工程中新建文件夾,并將復(fù)制的文件添加到工程之中
⑥修改添加到MyFiles文件夾下的所有.c和.h文件
由于涉及到的修改較多,不做一一介紹,直接給出修改后的該文件夾下的所有文件附件。(可聯(lián)系獲?。?/p>
⑦修改main.c文件
在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */之間添加為app.h 和bsp.h的包含:
/* USER CODE BEGIN Includes */#include "bsp.h"#include "app.h"/* USER CODE END Includes */
修改int main(void)函數(shù):/** * @brief The application entry point. * @retval int */int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ BSP_MCU_Initial(); BSP_RF_Initial(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ APP_Process(); } /* USER CODE END 3 */}
添加USART1的接收和發(fā)送中斷回調(diào)函數(shù),
在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */加入代碼:
/* USER CODE BEGIN 4 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart == &huart1) { Uart_Rx_interrupt_Cb();
}}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){ if(huart == &huart1) { Uart_Tx_interrupt_Cb(); }}/* USER CODE END 4 */
⑧修改stm32f1xx_it.c文件
添加對(duì)app.h的包含,在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */之間加入代碼:
/* USER CODE BEGIN Includes */#include "app.h"/* USER CODE END Includes */
修改void SysTick_Handler(void)函數(shù),
在 /* USER CODE BEGIN SysTick_IRQn 1 */和/* USER CODE END SysTick_IRQn 1 */之間加入:
/** * @brief This function handles System tick timer. */void SysTick_Handler(void){ /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ Uart_1ms_Interrupt_Cb(); /* USER CODE END SysTick_IRQn 1 */}
至此,程序移植已經(jīng)全部完成,再次重新編譯。如果出現(xiàn)warning: #1-D: last line of file ends without a newline這個(gè)警告,請(qǐng)?jiān)谠撐募詈笠恍刑砑有滦小?/p>
通信驗(yàn)證
①程序下載
將ST-LINK的下載接口與STM32核心板的下載接口連接,對(duì)應(yīng)接線如下:
Debug配置:
配置完成后,點(diǎn)擊LOAD進(jìn)行下載。
下載成功后,會(huì)出現(xiàn)如下提示:
②硬件連接
建議在接線過(guò)程中斷電操作。STM32核心板的供電使用自帶的USB接口供電。
STM32核心板與E01-ML01D連接
STM32核心板與USB轉(zhuǎn)TTL工具連接
③通信測(cè)試
將核心板通過(guò)USB接口供電,USB轉(zhuǎn)TTL工具連接上電腦上的串口調(diào)試助手。串口調(diào)試助手配置如下:
將STM32核心板復(fù)位,它首先會(huì)檢查與E01-ML01D的連接。如果連接成功,則會(huì)打印Link successful。如果鏈接失敗,則會(huì)打印Link Fail Please check and reset module。最大連接次數(shù)為6次,每次連接會(huì)打印當(dāng)前連接次數(shù)。
數(shù)據(jù)發(fā)送和接收,例程使用了nRF24L01P的ACK功能,所以在發(fā)送成功則會(huì)打印Send TX_DS,發(fā)送失敗會(huì)打印Send MAX_RT。
總結(jié)
以上實(shí)驗(yàn)中,實(shí)現(xiàn)了基于STM32F103C8T6核心板的E01-ML01D的驅(qū)動(dòng)移植以及通信驗(yàn)證,其中的E01-ML01D可以替換為任意型號(hào)的nRF24L01P或者Si24R1的模塊。也可以稍加修改,適用于其他STM32系列的MCU。
-
mcu
+關(guān)注
關(guān)注
146文章
17199瀏覽量
351906 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1844瀏覽量
85405 -
STM32
+關(guān)注
關(guān)注
2270文章
10915瀏覽量
356737
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論