RT-Thread studio学习笔记4-stm32F407 TIM14输出PWM

第一步,在STM32cubeMX软件中开启定时器TIM14,对应的引脚为PF9,生成代码,将src中的HAL_TIM_Base_MspInit、HAL_TIM_MspPostInit函数拷贝到RT-Thread的board.c中,这里有个一号坑,stm32cubemx生产的函数为HAL_TIM_Base_MspInit,需将其改为HAL_TIM_PWM_MspInit才可正确初始化PWM的TIM。

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspInit 0 */

  /* USER CODE END TIM14_MspInit 0 */
    /* TIM14 clock enable */
    __HAL_RCC_TIM14_CLK_ENABLE();
  /* USER CODE BEGIN TIM14_MspInit 1 */

  /* USER CODE END TIM14_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM14)
  {
  /* USER CODE BEGIN TIM14_MspPostInit 0 */

  /* USER CODE END TIM14_MspPostInit 0 */

    __HAL_RCC_GPIOF_CLK_ENABLE();
    /**TIM14 GPIO Configuration
    PF9     ------> TIM14_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF9_TIM14;
    HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM14_MspPostInit 1 */

  /* USER CODE END TIM14_MspPostInit 1 */
  }

}

第二步,打开定时器使能,在stm32f4xx_hal_conf.h中找到#define HAL_TIM_MODULE_ENABLED,取消注释,

第三步,在RT-Thread Settings中打开PWM功能,

第四步,在board.h中定义PWM宏定义,例如我要使用PWM14,则添加PWM14,这里还有一个2号坑,必须得添加#define BSP_USING_PWM14_CH1宏定义,

 

  第五步,在drv_pwm.c中添加PWM14_CH1的宏定义

第六步,打开 /drivers/include/config/pwm_config.h,对PWM14进行宏定义

 编译成本后,下载到开发板,

第七步验证,通过串口控制台发送pwm_enable pwm14 1使能PWM14的通道1输出,发送pwm_set pwm14 1 5000 2500,使PWM输出占空比为50%的200kHz的方波信号。验证通过。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread Studio是一个基于RT-Thread实时操作系统的集成开发环境,它可以方便地进行嵌入式软件开发。在这个环境下,我们可以使用DMA模式实现stm32f407的多通道ADC数据采集。 首先,我们需要配置ADC的多通道扫描模式,可以通过HAL库提供的函数进行配置。例如,我们可以使用以下代码实现通道1、2、3的扫描: ``` ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; HAL_ADC_ConfigChannel(&hadc1, &sConfig); sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = ADC_REGULAR_RANK_2; HAL_ADC_ConfigChannel(&hadc1, &sConfig); sConfig.Channel = ADC_CHANNEL_3; sConfig.Rank = ADC_REGULAR_RANK_3; HAL_ADC_ConfigChannel(&hadc1, &sConfig); hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.NbrOfDiscConversion = 0; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 3; HAL_ADC_Init(&hadc1); ``` 接下来,我们需要配置DMA的通道和缓冲区,可以使用HAL库提供的函数进行配置。例如,我们可以使用以下代码实现DMA通道1和缓冲区的配置: ``` DMA_HandleTypeDef hdma_adc1 = {0}; hdma_adc1.Instance = DMA2_Stream0; hdma_adc1.Init.Channel = DMA_CHANNEL_0; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; HAL_DMA_Init(&hdma_adc1); __HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1); HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buffer, ADC_BUFFER_SIZE); ``` 最后,我们需要在主循环中读取DMA缓冲区的数据,可以使用以下代码实现: ``` while (1) { for (int i = 0; i < ADC_BUFFER_SIZE; i += 3) { uint16_t ch1 = adc_buffer[i]; uint16_t ch2 = adc_buffer[i + 1]; uint16_t ch3 = adc_buffer[i + 2]; // 处理数据 } HAL_Delay(10); } ``` 通过以上步骤,我们就成功地使用DMA模式实现了stm32f407的多通道ADC数据采集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值