03 实际操作 以CW32L083为例,控制基本定时器BTIM1以固定的时间间隔产生中断,并在ARR溢出中断中控制口线电平翻转。
1. RCC时钟初始化 void RCC_Configuration(void) { RCC_HSI_Enable(RCC_HSIOSC_DIV6); //系统时钟设置为HSI时钟6分频,8MHz, PCLK、HCLK不分频,PCLK=HCLK=SysClk=8MHz __RCC_BTIM_CLK_ENABLE(); __RCC_GPIOB_CLK_ENABLE(); } 2.初始化GPIO口 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.IT = GPIO_IT_NONE; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pins = GPIO_PIN_8; GPIO_Init(CW_GPIOB, &GPIO_InitStruct); } 3.配置嵌套矢量中断控制器 void NVIC_Configuration(void) { __disable_irq(); NVIC_EnableIRQ(BTIM1_IRQn); __enable_irq(); } 4.主函数 int32_t main(void) { BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct = {0};
/* System Clocks Configuration */ RCC_Configuration();
/* NVIC Configuration */ NVIC_Configuration();
/* GPIO Configuration */ GPIO_Configuration();
BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER; /* 工作模式,00:定时器模式01:计数器模式10:触发计数模式11:门控计数模式 */ BTIM_TimeBaseInitStruct.BTIM_Period = 49999; /* 计数重载周期,取值范围0x0000 到 0xFFFF. */ BTIM_TimeBaseInitStruct.BTIM_Prescaler = 7; // 8分频 /*8分频, 预分配系数,取值范围2的n次幂,n=0,1,2…15 */ BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct); //BTIM基本定时器初始化 BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE); // 使能BTIMx的溢出中断 BTIM_Cmd(CW_BTIM1, ENABLE); /*BTIM1以1MHz时钟进行计数,设置ARR寄存器为49999,则BTIM1将每50ms溢出一次,并触发中断服务程序。*/ while (1) { /* 中断服务程序中 PB8输出翻转 */ } } 5.中断函数:PB08输出翻转 void BTIM1_IRQHandler(void) { /* USER CODE BEGIN */ if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV)) // 检查BTIM的状态寄存器的各状态位是否置位 { BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV); // 清除BTIM的状态寄存器的各状态位 PB08_TOG(); //PB08口信号翻转 }
/* USER CODE END */ } 6.实验验证 示波器检测PB08口的信号输出,示波器波形图呈周期性翻转。
|