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