本帖最后由 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。不知是何原因。
|