赞
踩
有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置
1、芯片: STM32F407ZGT6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F4xxHAL库
1、控制LED一秒闪烁一次
2、实现串口通信:电脑控制pwm频率,串口输出pwm频率
3、按键控制呼吸灯暂停与继续
4、非线性呼吸灯实现
根据数据手册配置相应引脚的参数,此芯片PF10为LED灯,PB8,PB9,PA0为按键
为避免在按键中断中延时函数卡死,需改变Time base优先级
设置定时器频率为1HZ
定时器频率=168MHZ / (PSC+1) / (ARR+1)
占空比先不填,到代码中实现
至此,CUBEMX配置完成
- #include "stdio.h"
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
- int fgetc(FILE *f)
- {
- uint8_t ch = 0;
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
- return ch;
- }
- HAL_TIM_Base_Start_IT(&htim1);//定时器1中断初始化
- HAL_TIM_PWM_Start (&htim14, TIM_CHANNEL_1);//Pwm初始化
- printf("Hello World\r\n");//串口输出测试
- HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1); //串口接收初始化
- void pwm(void)
- {
- if(fxx==0){ //若为线性呼吸灯
- if(k&&flag){
- if(bri>=TIM14->ARR){
- dir=-1;
- }
- else if(bri<=0){
- dir=1;
- }
- bri+=dir;
- }
- }
- else if(fxx==1){ //若为非线性呼吸灯
- if(bri>=TIM14->ARR){
- dir=-1;
- i=0;
- flag_fxx=1;
- }
- else if(bri<=0){
- dir=1;
- flag_fxx=0;
- }
- i=(dir+i>=100||flag_fxx)?0:i+1;
- bri+=dir+i;
- }
- TIM14->CCR1=bri;
- HAL_Delay(10);
- }
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- UNUSED(huart);
- if(huart==&huart2){
- if(Uart1_Rx_Cnt >= 255) {
- Uart1_Rx_Cnt = 0;
- memset(RxBuffer,0x00,sizeof(RxBuffer));
- HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
- }
- else{
- RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;
- if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) {
- strcpy(rx_buf,RxBuffer);
- pl=0;
- pl=atoi(rx_buf);
- htim14.Instance->PSC = (uint16_t )((double)84000000/(double)(htim14.Instance->ARR+1)/pl)+1;
-
- while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
- Uart1_Rx_Cnt = 0;
- memset(RxBuffer,0x00,sizeof(RxBuffer));
- }
- flag=0;
- }
- HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
- }
- }
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
- if ( htim -> Instance == TIM1 ){
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
- duty=(double)(htim14.Instance->CCR1)/(double)(htim14.Instance->ARR+1);
- HZ=84000000/(htim14.Instance->ARR +1)/(htim14.Instance->PSC);
- printf ("HZ==%.0fhz DuTy==%.1f%%\r\n \r\n",HZ,duty*100);
- }
- }
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){
- HAL_Delay(20); //延时消抖
- if(GPIO_Pin == KEY0_Pin){
- k=1-k;
- flag=1-flag;
- printf("NO.%d\r\n",no++);
- }
- }
- else if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){
- HAL_Delay(20);
- if(GPIO_Pin == KEY1_Pin){
- fxx=1-fxx;
- printf("NO.%d\r\n",no++);
- }
- }
- }
- while(1){
- if(k&&flag==0){
- HAL_Delay(5);
- k=1;
- flag=1;
- }
- pwm();
- }
完工
参见
STM32CubeMX学习笔记(13)——PWM输出(呼吸灯)使用
【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。