CUBEMX-配置使用_1

下述内容为配置自己项目需要的功能

目录

【1】配置ADC

【2】FreeRTOS

【3】FatFS 

【4】UCB_MSC

【5】定时器-PWM

补充知识

中断的使用


【1】配置ADC

①使能自动转换模式

CUBEMX-配置使用_1_第1张图片

② 开启ADC中断(非必须)

CUBEMX-配置使用_1_第2张图片

③修改ADC时钟 ADC最大为14Mhz

 CUBEMX-配置使用_1_第3张图片

CubeMX prinf无法打印浮点数时要声明

①没有声明打印出来都是0

②声明类型

 CUBEMX-配置使用_1_第4张图片

STM32CubeIDE使用sprintf/printf发送浮点数失败

keil 实时监看

将变量添加到watch窗口中,且变量要为全局变量。CUBEMX-配置使用_1_第5张图片

【2】FreeRTOS

以下内容源自rtos_stm32_cubemx信号量理论_哔哩哔哩_bilibili

参数配置解析:

FreeRTOS—STM32—CubeMX常用初始化 - 哔哩哔哩

 在STMCubeIDE配置FreeRTOS的各种参数_include_vtaskcleanupresources_luckyzz99的博客-CSDN博客

系统时钟选定的定时器不用包含其他中断

CUBEMX-配置使用_1_第6张图片 要是设置为全局中断的定时器,并且提高他的优先级高于freeRTOS能管辖的优先级 ,不不然freeRTOS来影响他,因为HAL_Delay要用到这个中断,如果在freeRTOS的管辖范围内,那么这个中断就可能被其他中断打断。

CUBEMX-配置使用_1_第7张图片

RTOS默认的栈大小是不够的需要再加大,实际配置任务的优先级不要超过配置用户优先级,如配置一个任务的优先级为8超过7,运行异常,最高优先级的8不会首先运行。

CUBEMX-配置使用_1_第8张图片

CUBEMX-配置使用_1_第9张图片

常用API

CUBEMX-配置使用_1_第10张图片

图解相对延时和绝对延时

RTOS相对延时和绝对延时的区别_strongerHuang的博客-CSDN博客

消息队列,队列不属于任何一个任务

CUBEMX-配置使用_1_第11张图片

接收函数的返回值

CUBEMX-配置使用_1_第12张图片

 这个任务里面为什么不需要设置vTaskDelay? ,当等待时间为0时会卡死,就得加vTaskDelay。

CUBEMX-配置使用_1_第13张图片

调度的开始位置

按键驱动

GitHub - 0x1abin/MultiButton: Button driver for embedded system

C语言实现事件驱动型按键驱动模块MultiButton

https://www.cnblogs.com/david-wei0810/p/5848449.html

MultiButton按键驱动模块的使用_luobeihai的博客-CSDN博客

按键事件识别开发利器:开源按键组件MultiButton ---- 使用、代码分析_按键开源组件_机器灵魂注入师的博客-CSDN博客

CUBEMX-配置使用_1_第14张图片

获取事件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;
       }
}

CUBEMX-配置使用_1_第15张图片

CUBEMX-配置使用_1_第16张图片

CUBEMX-配置使用_1_第17张图片

   CUBEMX-配置使用_1_第18张图片

【3】FatFS 

关闭格式化定义

  • 磁盘分区完毕后自然就是要进行文件系统的格式化

CUBEMX-配置使用_1_第19张图片

CUBEMX-配置使用_1_第20张图片

  去掉这俩加快编译

FatFs中文支持与编译环境配置_fr_invalid_name_kuaileguyue的博客-CSDN博客

如下配置支持中文名

CUBEMX-配置使用_1_第21张图片

 不要带电拔插

增大栈空间      FatFs模块功能配置选项__min_ss_研究是为了理解的博客-CSDN博客

CUBEMX-配置使用_1_第22张图片

 SD卡任务空间堆栈加大

CUBEMX-配置使用_1_第23张图片

 CUBEMX-配置使用_1_第24张图片

 SD卡初始化时时钟频率不能超过400HZ,

 ①配置硬件SPI,CS口自己指定

CUBEMX-配置使用_1_第25张图片

CUBEMX-配置使用_1_第26张图片

CUBEMX-配置使用_1_第27张图片

②编写SPI的速度配置以及读写和SD卡的驱动库

③将响应的SD库函数挂载到FATFS的user_diskio.c

FatFs 常用 API 详细记录_fatfs api_Stark-Gs的博客-CSDN博客

【4】UCB_MSC

使用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以及时钟

CUBEMX-配置使用_1_第28张图片

配置储存设备的IO缓存 SD配置为512 因为SD卡一个扇区的512字节,而W25Q是4096字节

SD卡的配置

CUBEMX-配置使用_1_第29张图片

 W25Q的配置

CUBEMX-配置使用_1_第30张图片

②:配置一个管脚用来控制USB,DP口的上拉

        CUBEMX-配置使用_1_第31张图片

CUBEMX-配置使用_1_第32张图片

CUBEMX-配置使用_1_第33张图片

③:将相关读写函数配置到usb_storage_if.c文件中

④:测试时先挂载盘符,再拉高DP口。

17_USB (MSC),电赛主控,USB挂载W25Q128,实现U盘。_哔哩哔哩_bilibili

⑤:SDIO USB tick 卡死问题

CUBEMX-配置使用_1_第34张图片

stick 的中断优先级不够 无法中断USB的中断

CUBEMX-配置使用_1_第35张图片

 18_USB(MSC), 电赛主控,USB 挂载SD卡,实现读卡器_哔哩哔哩_bilibili

⑥:SD卡容量计算

CUBEMX-配置使用_1_第36张图片

⑦:修改生成的文件将对应接口函数挂载上去

CUBEMX-配置使用_1_第37张图片

CUBEMX USB之MSC(基于内部FLASH)_storage_write_fs_embedded_w的博客-CSDN博客​​​​​​

【5】定时器-PWM

配置一个2Khz 50%占空比的PWM

①分频系数72(这里要写72-1内部会加一操作)72分频后为1Mhz

②计数值500(这里要写500-1内部会加一操作)1Mhz/500 = 2Khz

③占空比50%的占空比计数计数值的一半500/2=250(这里不需要-1操作)

CUBEMX-配置使用_1_第38张图片

__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记录

CUBEMX-配置使用_1_第39张图片

这个函数的返回值应该为枚举类型 

CUBEMX-配置使用_1_第40张图片

因为这个函数返回的给的是一个枚举变量(包含多种状态),如果返回值为bool类型只有两种状态

CUBEMX-配置使用_1_第41张图片

补充知识

中断的使用

CubeMx的中断函数流程

①生成的中断函数入口在it.c中(这里的定时器2我是用做系统时钟,因为使用了freeRtos) 

CUBEMX-配置使用_1_第42张图片

②中断函数中又有一个生成的HAL_TIM_IRQHandler(&htim2);这里面处理包含了定时器2的各种中断(如果发生的对应性的中断会做清除中断位等处理不需要我们自己再做,这里对新手来说觉得很方便不用做过多处理,但是老手会觉得很臃肿因为要做一系列的判断)。

CUBEMX-配置使用_1_第43张图片

③这里用到了定时器更新事件

CUBEMX-配置使用_1_第44张图片

④定时器更新事件产生后这里会自动帮我们清除更新事件标志位__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);

然后再跳转到事件处理函数(回调函数)HAL_TIM_PeriodElapsedCallback(htim);

这个函数是一个弱定义__weak修饰的函数,过去看里面什么处理都没有我们可以在这里面做我们想要处理的事情,

CUBEMX-配置使用_1_第45张图片

 因为是__weak修饰的所以我们可以在别的地方再实现这个函数。

⑤这里CubeMX生成的函数将HAL_TIM_PeriodElapsedCallback(htim);重写在mian.c中里面做的事情就是调用HAL_IncTick();将全局变量“uwTick”加1这个全局变量作为应用程序时基。

CUBEMX-配置使用_1_第46张图片

【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博客

CUBEMX-配置使用_1_第47张图片

strlen("汉字")的值是多少_hzcyclone的博客-CSDN博客

你可能感兴趣的:(单片机,嵌入式硬件)