| 
 
| [AT32F405] 【AT-START-F405测评】+上位机串口控制PWM调节LED亮度 本次测试使用IDE为MDK5.23,直接在at_start_f405项目模板templates上添加自己的软件部分实现
 
   我在工程下增加了两个c文件:bsp_uart1.c和pwm.c.bsp_uart1.c这个文件主要是实现uart1 PA9和PA10的uart通讯;pwm.c主要是实现PWM的输出控制PF4输出的PWM占空比,进而调节LED2红灯的亮度
 
   bsp_uart1.c代码部分
 #include "includes.h"
 uint8_t uart1_recbuf[USART1_RXBUF_NUM]={0};
 uint8_t uart1_rec_cnt=0;
 static uint8_t uart1_flag=0;
 uint8_t get_uart1_flag(void)
 {
 return uart1_flag;
 }
 void set_uart1_flag(uint8_t flag)
 {
 uart1_flag=flag;
 }
 uint8_t get_uart1_len(void)
 {
 return uart1_rec_cnt;
 }
 void set_uart1_index(uint8_t val)
 {
 uart1_rec_cnt=val;
 }
 void USART1_IRQHandler(void)
 {
 volatile unsigned int IT_temp=0;
 if(usart_flag_get(USART1, USART_RDBF_FLAG)==SET)
 {
 usart_flag_clear(USART1, USART_RDBF_FLAG);
 IT_temp = USART1->sts;
 uart1_recbuf[uart1_rec_cnt++] = USART1->dt; //?ú?aà?2?òaó??a'?µ?o¯êy??òò?a IDLE?D??2??§3?D'0à'??3y
 }
 if(usart_flag_get(USART1, USART_IDLEF_FLAG)==SET)
 {
 IT_temp = USART1->sts;
 IT_temp = USART1->dt; //
 set_uart1_flag(1);
 }
 if(usart_flag_get(USART1, USART_TDC_FLAG)==SET)
 {
 usart_flag_clear(USART1, USART_TDC_FLAG);
 }
 }
 void uart1_init(uint32_t baudrate)
 {
 usart_parity_selection_type parity;
 gpio_init_type gpio_init_struct;
 /* enable the gpioa clock */
 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
 /* enable the usart2 and gpio clock */
 crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
 crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
 gpio_default_para_init(&gpio_init_struct);
 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
 gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
 gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_9;
 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
 gpio_init(GPIOA, &gpio_init_struct);
 RX_EN1();
 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;//RESE
 gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
 gpio_init_struct.gpio_pins = GPIO_PINS_8;
 gpio_init_struct.gpio_pull = GPIO_PULL_UP;
 gpio_init(GPIOA, &gpio_init_struct);
 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_7);
 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_7);
 parity=USART_PARITY_NONE;
 usart_parity_selection_config(USART1,parity);
 usart_init(USART1, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
 usart_transmitter_enable(USART1, TRUE);
 usart_receiver_enable(USART1, TRUE);
 usart_dma_transmitter_enable(USART1, TRUE);
 usart_dma_receiver_enable(USART1, TRUE);
 usart_flag_clear(USART1, USART_IDLEF_FLAG|USART_RDBF_INT);
 usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);
 usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
 //usart_interrupt_enable(USART1, USART_TDC_INT, TRUE);USART_RDBF_INT
 usart_flag_clear(USART1, USART_IDLEF_FLAG|USART_TDC_FLAG);
 usart_enable(USART1,TRUE);
 nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
 nvic_irq_enable(USART1_IRQn, 0, 2);
 }
 void bsp_uart1_init(uint32_t baudrate)
 {
 uart1_init(baudrate);
 //dma1_ch5_uart1_txd_init();
 //dma1_ch6_uart1_rxd_init();
 }
 void send_string1(unsigned char *pd,unsigned int len)
 {
 uint8_t i=0;
 while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
 for(i=0;i<len;i++)
 {
 //usart_data_transmit(USART1, usart2_tx_buffer[usart2_tx_counter++]);
 USART1->dt=*(pd+i);
 while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
 }
 //TX_EN1();
 //DMA1_CHANNEL5->ctrl_bit.chen=0;
 //DMA1->clr = DMA1_GL5_FLAG|DMA1_FDT5_FLAG|DMA1_HDT5_FLAG|DMA1_DTERR5_FLAG;
 //DMA1_CHANNEL5->maddr=(unsigned long)pd;
 //DMA1_CHANNEL5->dtcnt=len;
 //DMA1_CHANNEL5->ctrl_bit.chen=1;
 }
 pwm.c.代码部分
 #include "includes.h"
 crm_clocks_freq_type crm_clocks_freq_struct = {0};
 void pwm_init(void)
 {
 uint16_t CCR1Val = 136;
 uint16_t PrescalerValue = 0;
 uint16_t ch1_val = 1500;//325-1605
 uint16_t div_value = 0;
 tmr_output_config_type tmr_oc_init_structure;
 gpio_init_type gpio_init_struct;
 crm_periph_clock_enable(CRM_GPIOF_PERIPH_CLOCK, TRUE);
 crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK , TRUE);
 crm_clocks_freq_get(&crm_clocks_freq_struct);
 gpio_init_struct.gpio_pins = GPIO_PINS_4;
 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
 gpio_init(GPIOF, &gpio_init_struct);
 gpio_pin_mux_config(GPIOF, GPIO_PINS_SOURCE4, GPIO_MUX_1);
 div_value =  (uint16_t) ((crm_clocks_freq_struct.apb1_freq) / 36000000) - 1;
 /* tmr10 time base configuration */
 tmr_base_init(TMR2, 1999, div_value);
 tmr_cnt_dir_set(TMR2, TMR_COUNT_UP);
 tmr_clock_source_div_set(TMR2, TMR_CLOCK_DIV1);
 tmr_output_default_para_init(&tmr_oc_init_structure);
 tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
 tmr_oc_init_structure.oc_idle_state = FALSE;
 tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
 tmr_oc_init_structure.oc_output_state = TRUE;
 tmr_output_channel_config(TMR2, TMR_SELECT_CHANNEL_1, &tmr_oc_init_structure);
 tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_1, ch1_val);
 tmr_output_channel_buffer_enable(TMR2, TMR_SELECT_CHANNEL_1, TRUE);
 tmr_period_buffer_enable(TMR2, TRUE);
 /* tmr enable counter */
 tmr_counter_enable(TMR2, TRUE);
 }
 同时修改主函数main.c部分功能如下
 int main(void)
 {
 uint16_t pwm_ratio=0;
 data_un dat_un1={0};
 uint8_t len=0;
 system_clock_config();
 at32_board_init();
 bsp_uart1_init(115200);
 pwm_init();
 button_exint_init();
 while(1)
 {
 //    at32_led_toggle(LED2);
 //    delay_ms(g_speed * DELAY);
 //    at32_led_toggle(LED3);
 //    delay_ms(g_speed * DELAY);
 //    at32_led_toggle(LED4);
 //    delay_ms(g_speed * DELAY);
 if(get_uart1_flag()==1)
 {
 set_uart1_flag(0);
 //len=USART1_RXBUF_NUM-DMA1_CHANNEL6->dtcnt;
 len=get_uart1_len();
 if(len<=36)
 {
 memcpy(dat_un1.data_buf,uart1_recbuf,len);
 set_uart1_index(0);
 if(len!=0)
 {
 if(dat_un1.com_struct.addr==1)
 {
 if(MBCRC16(dat_un1.data_buf,len)==0)
 {
 if(dat_un1.com_struct.func==6)
 {
 if(dat_un1.com_struct.reg_addr==0x00)
 {
 pwm_ratio=dat_un1.com_struct.reg_val;
 if(pwm_ratio<=1000)
 tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_1, pwm_ratio*2);
 }
 }
 }
 }
 send_string1(uart1_recbuf,len);
 }
 }
 }
 }
 }
 为了增加显示效果,我基于C#修改了一个简单的上位机界面来实现亮度连续的调节
 
   通过拖动滚动条,串口连续输出PWM的占空比0-1000,开发板LED2同步实现亮度的调节。有感兴趣的网友可以找我私信MDK工程文件源码。
 
 
 | 
 |