[活动专区] 【AT-START-F407测评】+ 呼吸灯

[复制链接]
 楼主| YangTwo 发表于 2023-1-30 15:22 | 显示全部楼层 |阅读模式
本帖最后由 YangTwo 于 2023-1-30 15:22 编辑

感谢雅特力提供的F407开发板,AT32F407系列高效能微控制器,搭载32位ARM® Cortex®-M4内核,配合先进制程可达超高效能240MHz的运算速度。 内建的单精度浮点运算单元(FPU)及数字信号处理器(DSP),搭配丰富的外设及灵活的时钟控制机制,能满足多种领域应用。 完善的内存设计,最高可支持1MB闪存存储器(Flash)及224KB随机存取存储器(SRAM)。
6244763d754f192772.png

本文基于这块开发板来实现呼吸灯效果,于此同时体验一下雅特力丰富完善的开发生态。

首先去雅特力官网下载最新的固件库:https://www.arterytek.com/cn/product/AT32F407.jsp#Resource
6952263d755ab07cc1.png

然后打开其中的例程,比如LED相关的:AT_START_F407_CH_V1.2\AT32F403A_407_Firmware_Library_V2.1.3\project\at_start_f407\examples\gpio\led_toggle

所谓的呼吸灯就是一个LED小灯慢慢的亮起来,再慢慢的暗下去。这个所谓的“亮”与“暗”可以通过控制单片机引脚高低电平的不同组合来实现。这个高低电平组合起来的方波我们称之为PWM波,还有对应的一个叫做“占空比”的概念来调整高低电平的比例。本文拟通过更加简单的延迟功能来实现呼吸灯!

第一步实现一个us级别的延迟函数:
  1. void myDelay_us(uint32_t x){
  2.         uint16_t i;
  3.         while(x--){
  4.                 for(i = 50; i ;i --)
  5.                         ;
  6.         }
  7. }  



第二步也是呼吸灯的核心代码:
  1. void breathLED(void){

  2.     unsigned int i,j;
  3.     for(i = 0; i < 500; i+= 10){
  4.         for(j=0;j<100;j++){
  5.             at32_led_on(LED2);
  6.             myDelay_us(i);
  7.             at32_led_off(LED2);
  8.             myDelay_us(500-i);
  9.         }
  10.     }
  11.         
  12.     for(i = 0; i < 500; i+= 10){
  13.         for(j=0;j<100;j++){
  14.             at32_led_on(LED2);
  15.             myDelay_us(500-i);
  16.             at32_led_off(LED2);
  17.             myDelay_us(i);
  18.         }
  19.     }        

  20. }




第三步:主函数编写
  1. int main(void)
  2. {
  3.   system_clock_config();

  4.   at32_board_init();
  5.   
  6.         while(1){
  7.         
  8.         at32_led_toggle(LED4);
  9.     myDelay_us(1200*1000);
  10.                
  11.                 breathLED();
  12.         }
  13.                 //
  14.         
  15.   while(1)
  16.   {
  17.          
  18.     at32_led_toggle(LED2);
  19.     delay_ms(1200);
  20.     at32_led_toggle(LED3);
  21.     delay_ms(1200);
  22.     at32_led_toggle(LED4);
  23.     delay_ms(1200);
  24.          
  25.         //
  26.   }
  27. }



最后效果:
WeChat_dL6f5I1f68.gif


遇到的问题:刚开始延迟us打算使用库函数:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  inserts a delay time.
  3.   * @param  nus: specifies the delay time length, in microsecond.
  4.   * @retval none
  5.   */
  6. void delay_us(uint32_t nus)
  7. {
  8.   uint32_t temp = 0;
  9.   SysTick->LOAD = (uint32_t)(nus * fac_us);
  10.   SysTick->VAL = 0x00;
  11.   SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
  12.   do
  13.   {
  14.     temp = SysTick->CTRL;
  15.   }while((temp & 0x01) && !(temp & (1 << 16)));

  16.   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  17.   SysTick->VAL = 0x00;
  18. }



不过程序执行到while((temp & 0x01) && !(temp & (1 << 16)));跳不出来,调试发现temp的值总为0x5。不知是何原因。

TTTMM 发表于 2023-6-28 10:11 | 显示全部楼层
你好,请问你解决了吗
TTTMM 发表于 2023-6-30 15:05 | 显示全部楼层
你好,请问你试了用PWM怎么写吗
yangxiaor520 发表于 2023-7-1 11:35 来自手机 | 显示全部楼层
雅特力什么时候出M7内核的MCU呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

111

帖子

1

粉丝
快速回复 返回顶部 返回列表