下述内容为配置自己项目需要的功能
目录
【1】配置ADC
【2】FreeRTOS
【3】FatFS
【4】UCB_MSC
【5】定时器-PWM
补充知识
中断的使用
①使能自动转换模式
② 开启ADC中断(非必须)
③修改ADC时钟 ADC最大为14Mhz
CubeMX prinf无法打印浮点数时要声明
①没有声明打印出来都是0
②声明类型
STM32CubeIDE使用sprintf/printf发送浮点数失败
keil 实时监看
以下内容源自rtos_stm32_cubemx信号量理论_哔哩哔哩_bilibili
参数配置解析:
FreeRTOS—STM32—CubeMX常用初始化 - 哔哩哔哩
在STMCubeIDE配置FreeRTOS的各种参数_include_vtaskcleanupresources_luckyzz99的博客-CSDN博客
系统时钟选定的定时器不用包含其他中断
要是设置为全局中断的定时器,并且提高他的优先级高于freeRTOS能管辖的优先级 ,不不然freeRTOS来影响他,因为HAL_Delay要用到这个中断,如果在freeRTOS的管辖范围内,那么这个中断就可能被其他中断打断。
RTOS默认的栈大小是不够的需要再加大,实际配置任务的优先级不要超过配置用户优先级,如配置一个任务的优先级为8超过7,运行异常,最高优先级的8不会首先运行。
常用API
图解相对延时和绝对延时
RTOS相对延时和绝对延时的区别_strongerHuang的博客-CSDN博客
消息队列,队列不属于任何一个任务
接收函数的返回值
这个任务里面为什么不需要设置vTaskDelay? ,当等待时间为0时会卡死,就得加vTaskDelay。
调度的开始位置
按键驱动
GitHub - 0x1abin/MultiButton: Button driver for embedded system
C语言实现事件驱动型按键驱动模块MultiButton
https://www.cnblogs.com/david-wei0810/p/5848449.html
MultiButton按键驱动模块的使用_luobeihai的博客-CSDN博客
按键事件识别开发利器:开源按键组件MultiButton ---- 使用、代码分析_按键开源组件_机器灵魂注入师的博客-CSDN博客
获取事件MultiButton按键驱动模块的使用_luobeihai的博客-CSDN博客
void button_callback(void *button) { uint32_t btn_event_val; btn_event_val = get_button_event((struct Button *)button); switch(btn_event_val) { case PRESS_DOWN: printf("---> key1 press down! <---\r\n"); break; case PRESS_UP: printf("***> key1 press up! <***\r\n"); break; case PRESS_REPEAT: printf("---> key1 press repeat! <---\r\n"); break; case SINGLE_CLICK: printf("---> key1 single click! <---\r\n"); break; case DOUBLE_CLICK: printf("***> key1 double click! <***\r\n"); break; case LONG_RRESS_START: printf("---> key1 long press start! <---\r\n"); break; case LONG_PRESS_HOLD: printf("***> key1 long press hold! <***\r\n"); break; } }
获取按键ID开源按键组件Multi_Button的使用,含测试工程_天外飞仙CUG的博客-CSDN博客
void BTN_PRESS_DOWN_Handler(void* btn) { Button *temp_button = (Button *)btn; switch(temp_button->button_id) { case btn1_id: printf("btn1 press down\r\n"); break; case btn2_id: printf("btn2 press down\r\n"); break; default: break; } }
关闭格式化定义
- 磁盘分区完毕后自然就是要进行文件系统的格式化
去掉这俩加快编译
FatFs中文支持与编译环境配置_fr_invalid_name_kuaileguyue的博客-CSDN博客
如下配置支持中文名
不要带电拔插
增大栈空间FatFs模块功能配置选项__min_ss_研究是为了理解的博客-CSDN博客SD卡任务空间堆栈加大
SD卡初始化时时钟频率不能超过400HZ,
①配置硬件SPI,CS口自己指定
②编写SPI的速度配置以及读写和SD卡的驱动库
③将响应的SD库函数挂载到FATFS的user_diskio.c
FatFs 常用 API 详细记录_fatfs api_Stark-Gs的博客-CSDN博客
使用STM32CubeMX创建USB MSC工程_storage_init_hs_仰望·高端玩家的博客-CSDN博客
CUBEMX USB之MSC+FATFS(基于外部FLASH(W25Q128))_embedded_w的博客-CSDN博客
STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS)_msc_media_packet_Corner_L的博客-CSDN博客
4.5.2 CUBEMX USB之MSC+FATFS+FLASH(内部)_finfo.fattrib 0x16 system~1_embedded_w的博客-CSDN博客
①:cubem配置USB以及时钟
配置储存设备的IO缓存 SD配置为512 因为SD卡一个扇区的512字节,而W25Q是4096字节
SD卡的配置
W25Q的配置
②:配置一个管脚用来控制USB,DP口的上拉
③:将相关读写函数配置到usb_storage_if.c文件中
④:测试时先挂载盘符,再拉高DP口。
17_USB (MSC),电赛主控,USB挂载W25Q128,实现U盘。_哔哩哔哩_bilibili
⑤:SDIO USB tick 卡死问题
stick 的中断优先级不够 无法中断USB的中断
18_USB(MSC), 电赛主控,USB 挂载SD卡,实现读卡器_哔哩哔哩_bilibili
⑥:SD卡容量计算
⑦:修改生成的文件将对应接口函数挂载上去
CUBEMX USB之MSC(基于内部FLASH)_storage_write_fs_embedded_w的博客-CSDN博客
配置一个2Khz 50%占空比的PWM
①分频系数72(这里要写72-1内部会加一操作)72分频后为1Mhz
②计数值500(这里要写500-1内部会加一操作)1Mhz/500 = 2Khz
③占空比50%的占空比计数计数值的一半500/2=250(这里不需要-1操作)
__HAL_TIM_SET_PRESCALER();修改预分频
__HAL_TIM_SET_AUTORELOAD ();修改计数值
__HAL_TIM_SET_COMPARE();修改占空比
STM32CubeMX之定时器PWM输出_cubemx pwm_IT_阿水的博客-CSDN博客STM32CUBEIDE(11)----输出PWM及修改PWM频率与占空比_stm32修改pwm频率_记帖的博客-CSDN博客
计算 定时器arr和psc_psc arr_姜浩鑫的博客-CSDN博客
STM32F1/F7使用HAL库DMA方式输出PWM详解(输出精确数量且可调周期与占空比)_stm32使用dma方式输出pwm_何为其然的博客-CSDN博客
TIM_OCxPreloadConfig函数_tim_oc2preloadconfig_HBX_1024的博客-CSDN博客
STM32通过PWM模拟DAC输出16位,44.1KHz的声音,定时频率44.1K,PWM频率282.35K,低通滤波及 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)
8位PCM编码转换16位PCM_wandersky0822的博客-CSDN博客
定时器
影子寄存器
STM32 定时器周期动态修改_stm32 更改定时器_EmbededCoder的博客-CSDN博客
STM32CubeMX——定时器之定时功能_stm32cubemx 定时器_lcp0633的博客-CSDN博客
stm32定时器中断_「话说定时器系列」之五:与影子寄存器预装功能有关的案例分享..._weixin_39617473的博客-CSDN博客
LL库TMI
STM32使用LL库PWM的DMA模式驱动ws2812_ws2812级联数量_wo4fisher的博客-CSDN博客
LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1); LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH2); LL_TIM_EnableAllOutputs(TIM1); LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t) &(TIM1->DMAR)); LL_TIM_ConfigDMABurst(TIM1, LL_TIM_DMABURST_BASEADDR_CCR1, //实现在TIM1定时器中启用DMA传输,并将CCR1的值(第一个比较寄存器的值)进行DMA传输 LL_TIM_DMABURST_LENGTH_2TRANSFERS); LL_DMA_ClearFlag_TC5(DMA1); //清除传输完成中断 LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5); //使能传输完成中断
BUG记录
这个函数的返回值应该为枚举类型
因为这个函数返回的给的是一个枚举变量(包含多种状态),如果返回值为bool类型只有两种状态
CubeMx的中断函数流程
①生成的中断函数入口在it.c中(这里的定时器2我是用做系统时钟,因为使用了freeRtos)
②中断函数中又有一个生成的HAL_TIM_IRQHandler(&htim2);这里面处理包含了定时器2的各种中断(如果发生的对应性的中断会做清除中断位等处理不需要我们自己再做,这里对新手来说觉得很方便不用做过多处理,但是老手会觉得很臃肿因为要做一系列的判断)。
③这里用到了定时器更新事件
④定时器更新事件产生后这里会自动帮我们清除更新事件标志位__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
然后再跳转到事件处理函数(回调函数)HAL_TIM_PeriodElapsedCallback(htim);
这个函数是一个弱定义__weak修饰的函数,过去看里面什么处理都没有我们可以在这里面做我们想要处理的事情,
因为是__weak修饰的所以我们可以在别的地方再实现这个函数。
⑤这里CubeMX生成的函数将HAL_TIM_PeriodElapsedCallback(htim);重写在mian.c中里面做的事情就是调用HAL_IncTick();将全局变量“uwTick”加1这个全局变量作为应用程序时基。
【STM32+cubemx】0003 HAL库开发:定时器基础应用,中断和回调函数_hal_tim_periodelapsedcallback_xiaobaibai_2021的博客-CSDN博客
⑥串口接收中断实践:STM32CubeMX-串口中断实验_cubemx串口中断_Top嵌入式的博客-CSDN博客
STM32CubeIDE 利用自带HAL库 串口收发_stm32cube实现串口接收数据_zateper的博客-CSDN博客
STM32CubeIDE 利用自带HAL库 串口收发_stm32cube实现串口接收数据_zateper的博客-CSDN博客
STM32 hal库串口空闲中断最新用法_hal空闲中断_北世安的博客-CSDN博客
HAL库 串口空闲中断+DMA接收不定长数据 详解及踩坑_hal库串口接收不定长数据_soledade的博客-CSDN博客
strlen("汉字")的值是多少_hzcyclone的博客-CSDN博客