本次任务主要实现的是各种板载资源外设的初始化和效果展示,其中包括LED控制,串口打印、USB枚举等等,初步规划使用IAR作为首要的开发环境,在Project Manager中进行配置:
先用一个例程试了一下,IAR的工程编译没有问题,可是下载调试一直失败,IAR版本不够,转战STM32CubeIDE。
硬件部分:
LED:板载了一颗绿色的LED,有下图可知控制引脚连接的为PA5,当PA5输出高电平时三极管打开,LED亮,反之LED灭;
按键:按键使用的输入引脚为PC13,也可以通过修改焊接到PA0,当按键按下时输入状态为高,反着为默认状态低;
串口:USART3连接到了调试的虚拟串口上了,所以奔驰串口打印就用它了;
USB:USB的引脚基本上是固定的,本板卡的板载芯片也只有这一路USB;
软件部分:
我们先用STM32CubeMX配置上面的板载资源,并生成初始代码。
根据MCU配置工程,搜索H503RB,选择STM32H503RBT6后生成工程;
首先修改工程配置,项目名、项目路径、开发环境等等,堆栈给大点,毕竟要用到USB;
接下来配置时钟,本开发板板载24Mhz无源晶振,我们选用外部时钟,注意请先在RCC中开启外部时钟;然后通过分频器倍频器使SYSCLK为96Mhz,这是本次我选择的系统时钟。虽然主频最高可以达到250M,不过那么快也没有用;如果有不合适的参数,对应的底色会变成红色,注意修改;
配置PA5为输出控制LED:
接着对输出配置进行修改,初始状态为高电平,推挽输出,默认下拉或者不上拉不下拉都可以,起一个单独的名字为LED:
配置串口3:
配置USB:
根据例程中的设计还需要进行一下两步的设计,启动THREDAX,在USB的使用过程中需要用到这个实时系统:
接下来是USBx,本开发板使用的USB协议是基于USBx进行的,可以直接配置为键盘:
为了测试使用的便捷性,我们引入按键的配置:
注意按键配置为外部中断,上升沿出发,重命名KEY,要开启中断;
接下来就是具体软件的实现了:
LED的操作基本使用的是如下函数:
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
按键中断使用回调函数:
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == KEY_Pin) {/* KEY */ if(uesr_key == 0) { uesr_key = 1; printf("** LED start blinking ** \n\r"); } else { uesr_key = 0; HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); printf("** LED stop blinking ** \n\r"); } } }
串口配置使用printf(),需要修改如下内容:
#include <stdio.h> #if defined(__ICCARM__) __ATTRIBUTES size_t __write(int, const unsigned char *, size_t); #endif /* __ICCARM__ */ #if defined(__ICCARM__) /* New definition from EWARM V9, compatible with EWARM8 */ int iar_fputc(int ch); #define PUTCHAR_PROTOTYPE int iar_fputc(int ch) #elif defined ( __CC_ARM ) || defined(__ARMCC_VERSION) /* ARM Compiler 5/6*/ #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #elif defined(__GNUC__) #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #endif /* __ICCARM__ */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART3 and Loop until the end of transmission */ HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF); return ch; }
注意使用AZURE_RTOS后函数在tx_app_thread_entry(ULONG thread_input)中编写:
void tx_app_thread_entry(ULONG thread_input) { /* USER CODE BEGIN tx_app_thread_entry */ while(1) { tx_app_cnt++; if(tx_app_cnt>=500) { tx_app_cnt = 0; if(uesr_key == 1) HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } tx_thread_sleep(1); } /* USER CODE END tx_app_thread_entry */ }
效果如下,同时LED会根据按键的操作进行显示:
USB的初始化也是在AZURE_RTOS中进行:
static VOID app_ux_device_thread_entry(ULONG thread_input) { /* USER CODE BEGIN app_ux_device_thread_entry */ TX_PARAMETER_NOT_USED(thread_input); MX_USB_PCD_Init(); /* USER CODE BEGIN USB_Device_Init_PreTreatment_1 */ HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x00, PCD_SNG_BUF, 0x14); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x80, PCD_SNG_BUF, 0x54); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x81, PCD_SNG_BUF, 0x94); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x01, PCD_SNG_BUF, 0xD4); HAL_PCDEx_PMAConfig(&hpcd_USB_DRD_FS, 0x82, PCD_SNG_BUF, 0x114); /* USER CODE END USB_Device_Init_PreTreatment_1 */ /* Initialize and link controller HAL driver */ ux_dcd_stm32_initialize((ULONG)USB_DRD_FS, (ULONG)&hpcd_USB_DRD_FS); /* Start the USB device */ HAL_PCD_Start(&hpcd_USB_DRD_FS); /* USER CODE END app_ux_device_thread_entry */ }
可以看到枚举成功:
到这里板载资源的利用基本上都实现了,同时也完成了基本作业以及提高作业的第一部分。