# arm32_wkspace **Repository Path**: fyang0906/arm32_wkspace ## Basic Information - **Project Name**: arm32_wkspace - **Description**: ARM32单片机学习 1. STM32F407ZGT6 2. DG32F303ZE - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-12 - **Last Updated**: 2025-08-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1. ARM32 位单片机开发环境 - 安装 KEIL MDK(V5.31) 或更高版本,避免兼容问题 - 安装单片机芯片支持包,支持包要求MDK527以上版本 - 安装JLINK软件 - 验证开发环境,编译、下载等 - 安装USB转串口驱动 - 安装ISP软件,通过串口烧写程序 ## 2. GPIO ![2-GPIO_1.png](./image/2-GPIO/2-GPIO_1.png) ![2-GPIO_2.png](./image/2-GPIO/2-GPIO_2.png) ![2-GPIO_3.png](./image/2-GPIO/2-GPIO_3.png) ![2-GPIO_4.png](./image/2-GPIO/2-GPIO_4.png) ![2-GPIO_5.png](./image/2-GPIO/2-GPIO_5.png) ![2-GPIO_6.png](./image/2-GPIO/2-GPIO_6.png) > 电流输出最大 25mA ![2-GPIO_7.png](./image/2-GPIO/2-GPIO_7.png) ![2-GPIO_8.png](./image/2-GPIO/2-GPIO_8.png) > 如上图,开漏输出只能提供低电平,无法提供高电平 ![2-GPIO_9.png](./image/2-GPIO/2-GPIO_9.png) > 开漏输出可以实现电平转换,如上图如果RL需要5V供电,单片机输出管脚只能提供3.3V,这情况下可以将NMOS管断开,直接使用连接上拉电阻使用的5V供电 ![2-GPIO_10.png](./image/2-GPIO/2-GPIO_10.png) > 如上图所示:推挽输出无法实现线与 ![2-GPIO_11.png](./image/2-GPIO/2-GPIO_11.png) ![2-GPIO_12.png](./image/2-GPIO/2-GPIO_12.png) ![2-GPIO_13.png](./image/2-GPIO/2-GPIO_13.png) ![2-GPIO_14.png](./image/2-GPIO/2-GPIO_14.png) ![2-GPIO_15.png](./image/2-GPIO/2-GPIO_15.png) > - 当外部输入电压 >= 0.7 倍vdd时为高电平1 > - 当外部输入电压 <= 0.3 倍vdd时为低电平0 ![2-GPIO_16.png](./image/2-GPIO/2-GPIO_16.png) > 应用场景:列如当单片机GPIO引脚作为UART的RX引脚时,需要配置为浮空输入模式,引脚连接外部器件的TX端口,此时端口的电平状态取决于外部器件TX端口的状态 ![2-GPIO_17.png](./image/2-GPIO/2-GPIO_17.png) > 如果按键未按下时,上图中的端口为浮空状态;此时它的电平状态是不确定的,不一定是高电平。如果端口是悬空的,当有外部干扰时,IO口检测到的电平有可能被误判为低电平影响业务逻辑。 ![2-GPIO_18.png](./image/2-GPIO/2-GPIO_18.png) > 上图中当按键没有被按下时,端口被上拉电阻置为高电平;这样就可以解决浮空输入模式下电平不确定的问题 ![2-GPIO_19.png](./image/2-GPIO/2-GPIO_19.png) > 上图中当按键没有被按下时,端口被下拉电阻设置为低电平;当按键被按下时,电流从单片机外部流向单片机内部;单片机内部的上下拉电阻典型值为40kΩ,外部限流电阻通常为1kΩ ![2-GPIO_20.png](./image/2-GPIO/2-GPIO_20.png) > 如果使用浮空输入驱动检测按键,需要在单片机外部添加上拉电阻或者下拉电阻,让端口在悬空状态下有明确的电平;通常上拉或下拉电阻为2kΩ~10kΩ ## 6.1 裸机程序的任务调度框架 **裸机任务调度方案1 -- 大锅饭** ![6-TaskSchedule_1.png](./image/6-TaskSchedule_1.png) **裸机任务调度方案2 -- 按需分配,效率更高** ![6-TaskSchedule_2.png](./image/6-TaskSchedule_2.png) **裸机任务调度方案3 -- 按需分配,软件架构更优** ```C int main(void) { Init(); while (1) { TaskHandler(); } } ``` ```C void TaskHandler(void) { for (uint8_t i = 0; i < TASK_NUM_MAX; i++) { if (g_taskComps[i].run) // 判断时间片标志 { g_taskComps[i].run = 0; // 标志清零 g_taskComps[i].pTaskFuncCb(); // 执行调度业务功能模块 } } } ``` ```C static void TaskSchedule(void) { for (uint8_t i = 0; i < TASK_NUM_MAX; i++) { if (g_taskComps[i].timCount) { g_taskComps[i].timCount--; if (g_taskComps[i].timCount == 0) { g_taskComps[i].run = 1; g_taskComps[i].timCount = g_taskComps[i].timRload; } } } } ``` ```C void SysTick_Handler(void) { TaskSchedule(); } ``` ```C typedef struct { uint8_t run; // 调度标志,1:调度,0:挂起 uint16_t timCount; // 时间片计数值 uint16_t timRload; // 时间片重载值 void (*pTaskFuncCb)(void); // 函数指针变量,用来保存业务功能模块函数地址 } TaskComps_t; static TaskComps_t g_taskComps[] = { {0, 5, 5, HmiTask}, {0, 200, 200, Usb2ComTask}, /* 添加业务功能模块 */ }; ``` ![6-TaskSchedule_3.png](./image/6-TaskSchedule_3.png) ## 7. 定时器硬件结构