打印
[活动专区]

【AT-START-F407测评】+ 呼吸灯

[复制链接]
731|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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)。


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

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


然后打开其中的例程,比如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级别的延迟函数:
void myDelay_us(uint32_t x){
        uint16_t i;
        while(x--){
                for(i = 50; i ;i --)
                        ;
        }
}  



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

    unsigned int i,j;
    for(i = 0; i < 500; i+= 10){
        for(j=0;j<100;j++){
            at32_led_on(LED2);
            myDelay_us(i);
            at32_led_off(LED2);
            myDelay_us(500-i);
        }
    }
        
    for(i = 0; i < 500; i+= 10){
        for(j=0;j<100;j++){
            at32_led_on(LED2);
            myDelay_us(500-i);
            at32_led_off(LED2);
            myDelay_us(i);
        }
    }        

}




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

  at32_board_init();
  
        while(1){
        
        at32_led_toggle(LED4);
    myDelay_us(1200*1000);
               
                breathLED();
        }
                //
        
  while(1)
  {
         
    at32_led_toggle(LED2);
    delay_ms(1200);
    at32_led_toggle(LED3);
    delay_ms(1200);
    at32_led_toggle(LED4);
    delay_ms(1200);
         
        //
  }
}



最后效果:



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

  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  SysTick->VAL = 0x00;
}



不过程序执行到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呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

76

帖子

1

粉丝