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();