STM32G031G8U6基于HAL库通过PWM实现红外发射

STM32cubeMX配置

由原理图可知,控制红外发射的管脚为PA5,且低电平导通,高电平关闭。查询STM32G031G8U6数据手册,PA5可以配置为TIM2的PWM CH1输出。
STM32cubeMX时钟配置:
在这里插入图片描述
TIM1配置:TIM1用来产生一个us级别的延时,以满足NEC协议的时序。
在这里插入图片描述
在这里插入图片描述
TIM2-CH1配置:我要产生的是38KHz的PWM,上面时钟配置STM32G031G8U6的时钟为64MHz,因此Counter Period设置为64MHz/38KHz=1684,通过对64Mhz分频得到38KHz。CH polarity设置为low是因为红外发射管是低电平导通,这样我在程序中填的占空比系数是直接更改低电平占空比而不是常规的高电平。至此STM32CubeMX配置完成,生成工程后打开keil工程。
在这里插入图片描述
在这里插入图片描述

C代码编写

先在TIM2_Init函数中USER CODE BEGIN TIM2_Init 2下添加打开定时器和打开PWM输出的两条语句,如下图中注释这里是重点。

void MX_TIM2_Init(void)
{
   

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {
   0};
  TIM_MasterConfigTypeDef sMasterConfig = {
   0};
  TIM_OC_InitTypeDef sConfigOC = {
   0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1684;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
   
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
   
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
   
    Error_Handler();
  
### STM32G031G8U6 使用 HAL 进行初始化和配置 对于 STM32G031G8U6 微控制器而言,利用 HAL (Hardware Abstraction Layer) 可以简化硬件资源的访问过程。HAL 提供了一套统一的应用程序接口(API),使得开发者无需深入了解底层寄存器操作即可完成外设功能开发。 #### 初始化项目结构 为了使用 HAL STM32 进行初始化设置,通常会借助于 ST 提供的 STM32CubeMX 工具来生成初始代码框架。通过该工具可以选择所需的时钟源、启用必要的外设以及设定其他启动参数[^1]。 ```c // 主函数入口处调用 SystemClock_Config 函数以配置系统时钟 void SystemClock_Config(void); int main(void){ // 初始化所有已配置的设备并准备就绪 HAL_Init(); // 配置系统时钟至最高频率 SystemClock_Config(); while(1){ /* 用户应用程序 */ } } ``` #### 外部组件初始化 针对特定应用需求,在主循环之前还需要对外围模块如 UART 或者 SPI 接口等做进一步初始化工作。这里举例说明如何基于 HAL 配置 USART 通信端口: - **UART 参数定义** ```c UART_HandleTypeDef huart1; static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ``` 上述代码片段展示了如何创建一个名为 `huart1` 的句柄对象,并对其属性进行了详细的赋值。这些属性涵盖了波特率、数据位长度等多个方面,最后通过调用 `HAL_UART_Init()` 来激活此实例化后的串行通讯单元[^3]。 #### 中断处理机制 当涉及到异步事件响应时,则需考虑中断服务例程(ISR)的设计。例如在接收到完整的字符序列之后触发相应的动作。下面是一个简单的例子展示怎样注册接收完成回调函数: ```c /* 注册接收完成后调用的回调函数 */ __weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1){ // 执行具体业务逻辑... } } /* 启动 DMA 方式的连续接收模式 */ if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE)!= HAL_OK){ Error_Handler(); } ``` 这段代码实现了两个重要部分:一是指定了当中断发生后应执行的具体行为;二是开启了直接内存访问(DMA)传输方式下的持续监听状态,从而提高了效率并减少了 CPU 占用时间[^4]。 #### 设置全局变量或其他控制选项 除了基本的功能性配置之外,有时也需要调整一些运行期间可能变动的状态量或阈值。比如 OLED 屏幕亮度调节、休眠等待间隔等等都可以作为全局性的配置项存在。 ```c typedef struct { uint16_t OLED_Brightness; uint8_t rest_time; uint8_t sleep_time; int temperature_set; } SYSTEM_SETTING_Typedef; SYSTEM_SETTING_Typedef system_set={ .OLED_Brightness=200, .rest_time=2, .sleep_time=5, .temperature_set=300 }; ``` 以上结构体定义了一个包含多个成员的数据集合用于保存系统的当前设置情况。这种方式有助于保持代码清晰度的同时也方便后续维护更新[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值