[其它] 【AT-START-F425测评】开箱&开发体验&5通道定时器PWM驱动

[复制链接]
1320|1
 楼主| dql2015 发表于 2022-3-12 16:02 | 显示全部楼层 |阅读模式
本帖最后由 dql2015 于 2022-3-12 16:08 编辑

#申请原创#@21小跑堂
一、开箱
感谢厂家和二姨家的开发板体验活动,自从疫情以来,ST家的再也用不起了,陆续寻找国产替代方案。
雅特力的开发板十分精致,兼容arduino uno扩展接口,使用十分方便:
1647067350477.jpg
反面介绍板子基本情况:
1647067350462.jpg
板卡正面靓照:
1647067350444.jpg

AT-START-F425采用的MCU是AT32F425R8T7-7,基于ARM Cortex®-M4的32位高性能处理器,外设配置LED灯,按钮,一个USB micro-B和一
个type A的连接器,和ArduinoTM Uno R3扩展接口。

开发板自带嵌入式调试/烧录工具AT-Link-EZ(算是CMSIS-DAP Link吧?),不需接入额外开发工具即可对芯片调试使用。

雅特力科技AT32F425官网主页:
https://www.arterytek.com/cn/product/AT32F425.jsp#ProuductSelection
官网做的高大上,资料分类十分方便阅读查找,比某些国产厂家强多了(实际下载数据手册、编程手册、参考手册阅读后,刷新了我对国产的认知,从资料的规范程度、详细程度、格式等上来说都比某gd强不少,值得广大国产厂家学习):
官网资料1.png 官网资料2.png
官网资料3.png

开发板芯片具体型号,96MHz,20KB RAM,64KB FLASH。
官网资料4.png
官网资料5.png
官网资料6.png

标准固件库(里面有丰富的例程)、keil支持包:

官网资料7.png

AT-Link调试器的驱动:
官网资料8.png

官网资料9.png
官网资料10.png

下载AT-Link调试器驱动安装:
下载驱动.png

成功后插入USB会看到串口设备和CMSIS-DAP设备:
安装好驱动.png

在使用keil开发前,需要先安装支持包:
keil支持包安装.png
标准固件库里面的例程十分详细,各个外设的各种模式用法:
固件库例子.png

二、5通道定时器PWM驱动RGB灯
手头有一块使用PWM驱动的arduino uno接口的RGB灯扩展板,正好基于它评测多路定时器PWM的应用。
PWM照明功能板是一款支持彩灯五路调光的 LED 控制器,照明功能板(PWM)可实现五路照明功能,带有暖光,冷白及 RGB 灯珠和相应的控制芯片。

扩展板特点如下:
冷白,暖白控制采用 SLM211A DC-DC 降压型 PWM 线性恒流调光控制芯片。
RGB 控制采用 BP168CJ DC-DC 降压型 PWM 线性恒流控制芯片。
外围有丰富的 PWM 接口:通过 PWMC,PWMW,PWMR,PWMG,PWMB 五路 PWM 信号控制色温亮度及炫彩 RGB。
PWMC        冷白 PWM 控制信号,高电平有效
PWMW        暖白 PWM 控制信号,高电平有效
PWMR        RGB 红光控制信号,高电平有效
PWMG        RGB 绿光控制信号,高电平有效
PWMB        RGB 蓝光控制信号,高电平有效


扩展板插在开发板上效果:
1647067350493.jpg

根据开发板原理图
原理图arduino接口.png

可以得到扩展板控制信号连接的管脚:
pwmR  ------ D11 ------  PA7  ------ 红光
pwmG  ------ D6  ------ PB10 ------  绿光
pwmB  ------ D3  ------ PB3   ------ 蓝光
pwmC  ------ D5 ------  PB4  ------  冷白
pwmW  ------ D9  ------ PC7 ------ 暖白


查询芯片手册管脚复用情况:
1.png

2.png

3.png

分配定时器和PWM通道如下:
pwmR --------- D11  --------- PA7  ---------  红光 --------- TMR14_CH1
pwmG ---------  D6  --------- PB10 ---------  绿光 --------- TMR2_CH3
pwmB  --------- D3  --------- PB3   ---------  蓝光 --------- TMR2_CH2
pwmC  --------- D5  --------- PB4 ---------   冷白 --------- TMR3_CH1
pwmW  --------- D9 ---------  PC7 ---------   暖白 --------- TMR3_CH2


基于固件库的pwm例程进行开发:
屏幕截图 2022-03-12 151618.png

main.c代码测试如下,实现pwm呼吸灯效果:
  1. #include "at32f425_board.h"
  2. #include "at32f425_clock.h"

  3. uint16_t timer_period = 0;
  4. uint16_t channel_pulse_r = 0, channel_pulse_g = 0, channel_pulse_b = 0, channel_pulse_c = 0, channel_pulse_w = 0;

  5. //pwmR D11 PA7 TMR14_CH1 红光
  6. //pwmG D6 PB10 TMR2_CH3 绿光
  7. //pwmB D3 PB3  TMR2_CH2 蓝光

  8. //pwmC D5 PB4  TMR3_CH1 冷白
  9. //pwmW D9 PC7  TMR3_CH2 暖白

  10. void timer_pwm_init(void)
  11. {
  12.         crm_clocks_freq_type crm_clocks_freq_struct = {0};
  13.         gpio_init_type  gpio_init_struct = {0};
  14.         tmr_output_config_type tmr_output_struct;

  15.   /* enable tmr14/tmr2/tmr3/gpiob clock */
  16.         crm_periph_clock_enable(CRM_TMR14_PERIPH_CLOCK, TRUE);
  17.   crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
  18.         crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
  19.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  20.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  21.         crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);

  22.         gpio_init_struct.gpio_pins = GPIO_PINS_7;
  23.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  24.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  25.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  26.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  27.   gpio_init(GPIOA, &gpio_init_struct);
  28.         
  29.   gpio_init_struct.gpio_pins = GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_10;
  30.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  31.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  32.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  33.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  34.   gpio_init(GPIOB, &gpio_init_struct);
  35.         
  36.         gpio_init_struct.gpio_pins = GPIO_PINS_7;
  37.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  38.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  39.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  40.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  41.   gpio_init(GPIOC, &gpio_init_struct);

  42.         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_4);//pwmR
  43.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE3, GPIO_MUX_2);
  44.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE4, GPIO_MUX_1);//pwmC
  45.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE10, GPIO_MUX_2);
  46.         gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE7, GPIO_MUX_0);//pwmW

  47.         /* get system clock */
  48.   crm_clocks_freq_get(&crm_clocks_freq_struct);
  49.   /* compute the value to be set in arr regiter to generate signal frequency at 17.57 khz */
  50.   timer_period = (crm_clocks_freq_struct.sclk_freq / 10000 ) - 1;
  51.   
  52.         tmr_base_init(TMR14, timer_period, 0);
  53.   tmr_cnt_dir_set(TMR14, TMR_COUNT_UP);
  54.         
  55.   tmr_base_init(TMR2, timer_period, 0);
  56.   tmr_cnt_dir_set(TMR2, TMR_COUNT_UP);
  57.         
  58.         tmr_base_init(TMR3, timer_period, 0);
  59.   tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);

  60.   /* channel configuration in output mode */
  61.   tmr_output_default_para_init(&tmr_output_struct);
  62.   tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_B;
  63.   tmr_output_struct.oc_output_state = TRUE;
  64.   tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_LOW;
  65.   tmr_output_struct.oc_idle_state = TRUE;
  66.   tmr_output_struct.occ_output_state = TRUE;
  67.   tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  68.   tmr_output_struct.occ_idle_state = FALSE;
  69.   
  70.         /* TMR14 channel 1  pwmR */
  71.   tmr_output_channel_config(TMR14, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  72.   tmr_channel_value_set(TMR14, TMR_SELECT_CHANNEL_1, 0);
  73.         
  74.         /* TMR2 channel 3 pwmG */
  75.   tmr_output_channel_config(TMR2, TMR_SELECT_CHANNEL_3, &tmr_output_struct);
  76.   tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_3, 0);

  77.   /* TMR2 channel 2 pwmB */
  78.   tmr_output_channel_config(TMR2, TMR_SELECT_CHANNEL_2, &tmr_output_struct);
  79.   tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_2, 0);
  80.         
  81.          /* TMR3 channel 1  pwmC */
  82.   tmr_output_channel_config(TMR3, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
  83.   tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_1, 0);
  84.         /* TMR3 channel 2   pwmW */
  85.   tmr_output_channel_config(TMR3, TMR_SELECT_CHANNEL_2, &tmr_output_struct);
  86.   tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_2, 0);
  87.   

  88.   /* output enable */
  89.         tmr_output_enable(TMR14, TRUE);
  90.   tmr_output_enable(TMR2, TRUE);
  91.         tmr_output_enable(TMR3, TRUE);
  92.   
  93.   /* enable tmr */
  94.         tmr_counter_enable(TMR14, TRUE);
  95.   tmr_counter_enable(TMR2, TRUE);
  96.         tmr_counter_enable(TMR3, TRUE);
  97. }

  98. //r:0~100
  99. //g:0~100
  100. //b:0~100
  101. //c:0~100
  102. //w:0~100
  103. void set_rgbcw(int r,int g,int b,int c,int w)
  104. {
  105.         channel_pulse_r = (uint16_t)(((uint32_t) r * (timer_period - 1)) / 100);
  106.         channel_pulse_g = (uint16_t)(((uint32_t) g * (timer_period - 1)) / 100);
  107.         channel_pulse_b = (uint16_t)(((uint32_t) b * (timer_period - 1)) / 100);
  108.         channel_pulse_c = (uint16_t)(((uint32_t) c * (timer_period - 1)) / 100);
  109.         channel_pulse_w = (uint16_t)(((uint32_t) w * (timer_period - 1)) / 100);
  110.         
  111.         /* TMR14 channel 1  pwmR */
  112.   tmr_channel_value_set(TMR14, TMR_SELECT_CHANNEL_1, channel_pulse_r);
  113.         
  114.         /* TMR2 channel 3 pwmG */
  115.   tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_3, channel_pulse_g);

  116.   /* TMR2 channel 2 pwmB */
  117.   tmr_channel_value_set(TMR2, TMR_SELECT_CHANNEL_2, channel_pulse_b);
  118.         
  119.          /* TMR3 channel 1  pwmC */
  120.   tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_1, channel_pulse_c);
  121.         
  122.         /* TMR3 channel 2   pwmW */
  123.   tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_2, channel_pulse_w);
  124. }


  125. int main(void)
  126. {
  127.   system_clock_config();
  128.         
  129.   at32_board_init();
  130.         
  131.         uart_print_init(115200);

  132.   /* turn led2/led3/led4 on */
  133.   at32_led_on(LED2);
  134.   at32_led_on(LED3);
  135.   at32_led_on(LED4);

  136.         timer_pwm_init();
  137.         
  138.         printf("AT-START-F425 PWM test!\r\n");
  139.         
  140.         at32_led_toggle(LED2);
  141.         at32_led_toggle(LED3);
  142.         at32_led_toggle(LED4);

  143.   while(1)
  144.   {
  145.                 for(int i=0;i<=100;i++)
  146.                 {
  147.                         set_rgbcw(i,0,0,0,0);
  148.                         delay_ms(10);
  149.                 }
  150.                 for(int i=100;i>=0;i--)
  151.                 {
  152.                         set_rgbcw(i,0,0,0,0);
  153.                         delay_ms(10);
  154.                 }
  155.                
  156.                 for(int i=0;i<=100;i++)
  157.                 {
  158.                         set_rgbcw(0,i,0,0,0);
  159.                         delay_ms(10);
  160.                 }
  161.                 for(int i=100;i>=0;i--)
  162.                 {
  163.                         set_rgbcw(0,i,0,0,0);
  164.                         delay_ms(10);
  165.                 }
  166.                
  167.                 for(int i=0;i<=100;i++)
  168.                 {
  169.                         set_rgbcw(0,0,i,0,0);
  170.                         delay_ms(10);
  171.                 }
  172.                 for(int i=100;i>=0;i--)
  173.                 {
  174.                         set_rgbcw(0,0,i,0,0);
  175.                         delay_ms(10);
  176.                 }
  177.                
  178.                 for(int i=0;i<=100;i++)
  179.                 {
  180.                         set_rgbcw(0,0,0,i,0);
  181.                         delay_ms(10);
  182.                 }
  183.                 for(int i=100;i>=0;i--)
  184.                 {
  185.                         set_rgbcw(0,0,0,i,0);
  186.                         delay_ms(10);
  187.                 }
  188.                
  189.                 for(int i=0;i<=100;i++)
  190.                 {
  191.                         set_rgbcw(0,0,0,0,i);
  192.                         delay_ms(10);
  193.                 }
  194.                 for(int i=100;i>=0;i--)
  195.                 {
  196.                         set_rgbcw(0,0,0,0,i);
  197.                         delay_ms(10);
  198.                 }
  199.   }
  200. }

驱动效果:
1647067350514.jpg

1647067350582.jpg

1647067350565.jpg

1647067350547.jpg

1647067350531.jpg

视频:
https://www.bilibili.com/video/BV1mU4y1o7fB?share_source=copy_web

总结:雅特力AT-START-F425开发板体验十分优秀,官网资料丰富,固件库例程丰富,上手简单,API简洁易用,给国产点赞。




七毛钱 发表于 2022-3-15 15:55 来自手机 | 显示全部楼层
最近看了很多雅特力的测评贴,感觉他家的开发板做的确实不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

384

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部