打印
[STM32F4]

【STM32F469I试用】学习记录2.在呼吸的流水灯

[复制链接]
4144|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pingis58|  楼主 | 2015-12-16 23:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 21ic小喇叭 于 2016-1-19 09:32 编辑

  还有两个帖子点击查看哟~~~https://bbs.21ic.com/icview-1239774-1-2.html
https://bbs.21ic.com/icview-1239682-1-1.html


折腾了两个晚上,一天安装STLINK后串口驱动始终装不上,由于WIN7 64位 GHOST版的原因,缺少组件,找了N多方法无效,参照此贴解决。http://www.stmcu.org/module/forum/thread-602290-1-1.htmlusbser.sys,mdmcpq.inf 这两个文件不同系统,是不一样的,切记。
一步步操作STM32CubeMX软件,导出的HAL库是很强大,但细细摸清楚也很烦锁,感觉不利于初学者,有两种接口,一种是宏扩展出来的,可快速操作到实例化指针对应的寄存器,一种很复杂的结构体嵌套配置函数,层次较多,最终底层是调用第一种接口的宏来操作寄存口。感觉MCU级别的库没必要这么复杂,反而麻烦,效率也不高。下面进入正题 :


1,在呼吸的流水灯,故名思义:呼吸灯 + 流水灯
  呼吸灯原理:就是像呼吸一样,慢吸气,逐渐变亮,慢呼气,逐渐变暗。但灯肉眼不能看出闪烁,否则就很难看了。
  开发板上带了LED,如果IO口常低就是灯亮,常高就是灯灭,要实现明暗变化,就需要占空比调制,以固定频率(人眼不能分辨的,人眼能分辨的为24Hz,当然因人而异,不排除具最强大脑的超人),减少灯亮的时间,亮度就会变暗。根据此原理,使用定时器的PWM生成固定频率的方波,占空比由高变低,然后变高,完成呼吸的一个循环。PWM频率取值100Hz
  另开发板的LED灯,内眼直接看,光源太聚集,刺眼且效果不太好看,最好加灯罩类的散光处理。简单处理,盖一张纸巾即可,效果也就一般。
2,接下来查看stm32f469的数据手册
                                       
                                       
                                       
  很遗憾,一个都没连到定时器的PWM通道。只能变相的操作,利用定时器1的比较中断(PWM电平改变时刻),和溢出中断(定时周期到,即频率控制),做软件的PWM模拟,呼吸完一个,放松,再呼吸一个。
3,为了以后调试方便,还面要一个调试输出口,通常都习惯用串口打印输出(printf)。
                                      
    由上图可知连接到STLK串口的引脚为PB10,PB11
                                    
   由上图数据手册查询可知,串口使用的是USART3
4,建立工程
                                       
    启动STM32CubeMX 点击New Project.
                                            
   选好开发板型号后双击,定时器使用输出比较模式,但不使能输出,利用比较,溢出中断产生软件的PWM。USART3选择Asynchronous其他选择默认即可。
               
                                          
       点击上面的Configration会看到使能的外设设置,先配置定时器(点击上图中的小闹钟)的溢出中断,比较中断,定时器的定时时间,随后我们用编译器的宏自己计算。串口设置起用默认。
   保存自行设置存储路径,在Project setting设置导出的KEIL工程,并导出。注意时钟我们没有配置,系统默认的是16M,芯片这块的手册我没有看,暂时就不管了。串口默认的波特率是115200,可以在上图的USART3中双击查看。
         在生成工程配置的时候,最好配置下图红框选项,一个是项目源文件清晰,还有个是不勾初初化代码不全,我的定时器里时钟使能,NVIC中断配置没有生成。
                                                   
5,源代码添加
      1)调试打印口,添加图片下面代码,在程序中即可直接使用printf函数
                  
      2)定时时间计算及填写
                 
                定时器全能有点特别,库中没有同时使能溢出,比较中断的驱动
        __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_CC1);//ÌṩµÄÇý¶¯½Ó¿ÚûÓÐÏֳɵļȿª±È½ÏÖжϣ¬ÓÖ¿ªÒç³öÖжÏ
        HAL_TIM_Base_Start_IT(&htim1);
      3)呼吸灯节奏控制的宏
                 
       4)中断代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */

        if(led_num >3)
                led_num = 0;
        switch(led_num)
        {
                case 0:
                        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_RESET);
                        break;
                case 1:
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);
                        break;
                case 2:
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
                        break;
                case 3:
                        HAL_GPIO_WritePin(GPIOK,GPIO_PIN_3,GPIO_PIN_RESET);
                        break;
        }

        cycle_n++;
        if(cycle_n < level_cycle)
        {
                return;
        }
        cycle_n = 0;

        if(brint_s == 0)
        {               
                if(brint_c >= level_max)//´ïµ½×î´óÁÁ¶È
                {
                        brint_c -= level_step;
                        brint_s = 1;
                }
                else//δ´ïµ½×î´óÁÁ¶È£¬¼ÌÐø±äÁÁ
                {
                        brint_c += level_step;
                }
        }               
        else
        {
                if(brint_c <= level_min)//´ïµ½×îСÁÁ¶È
                {
                        brint_c += level_step;
                        brint_s = 0;
                        led_num++;
                        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_SET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
                        HAL_GPIO_WritePin(GPIOK,GPIO_PIN_3,GPIO_PIN_SET);
                }
                else
                {
                        brint_c -= level_step;
                }
        }
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,brint_c);

  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  switch(led_num)
        {
                case 0:
                        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_SET);
                        break;
                case 1:
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);
                        break;
                case 2:
                        HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
                        break;
                case 3:
                        HAL_GPIO_WritePin(GPIOK,GPIO_PIN_3,GPIO_PIN_SET);
                        break;
        }
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
   */
}
/* USER CODE END 1 */
最后上传工程源码。有兴趣的可以看看,效果不是很好,做的有点粗糙,在暗区和亮区的不同等级时间调成不一样,效果可能会好点,这程序不支持,而且暗区的时候LED还是会感觉闪,可能偏暗的时候还要加快频率。超过5M了还得分卷。
test.part02.rar (2.87 MB)


test.part01.rar (2.93 MB)




沙发
捉虫天师| | 2015-12-17 00:40 | 只看该作者
效果不是很好,做的有点粗糙,在暗区和亮区的不同等级时间调成不一样,效果可能会好点,这程序不支持,而且暗区的时候LED还是会感觉闪,可能偏暗的时候还要加快频率。超过5M了还得分卷。
哈哈,楼主真谦虚,比其他废话的好多了。

使用特权

评论回复
板凳
捉虫天师| | 2015-12-17 00:45 | 只看该作者
在开发板正面屏幕两侧则是一些LED以及MEMS麦克风,背面的话是整个板卡的核心器件,说起来,这个格局调调和ST的STM32F7 Discovery开发板非常相似。使用过ST Discovery开发套件的工程师都知道,ST探索套件可以让用户非常方便、快速地开发应用程序,而板载的硬件外设基本都是用于更好的评估微控制器的功能,按照国际惯例,我们就先具体来看看STM32F469 Discovery板卡到底有些什么资源。

使用特权

评论回复
地板
pingis58|  楼主 | 2015-12-17 08:31 | 只看该作者
捉虫天师 发表于 2015-12-17 00:45
在开发板正面屏幕两侧则是一些LED以及MEMS麦克风,背面的话是整个板卡的核心器件,说起来,这个格局调调和S ...

你这奋斗的可真晚。我比你早的都快冻死了。

使用特权

评论回复
5
mmuuss586| | 2015-12-17 08:54 | 只看该作者

不错,继续努力;

使用特权

评论回复
6
秋风式街球| | 2015-12-17 09:22 | 只看该作者
赞一个

使用特权

评论回复
7
pingis58|  楼主 | 2015-12-17 12:01 | 只看该作者
mmuuss586 发表于 2015-12-17 08:54
不错,继续努力;

谢谢超版捧场:D

使用特权

评论回复
8
pingis58|  楼主 | 2015-12-17 12:01 | 只看该作者

你可以烧进去看看,然后帮我看看怎么改进效果会更好点

使用特权

评论回复
9
IC201505| | 2015-12-18 17:30 | 只看该作者
楼主加油!

使用特权

评论回复
10
okyouwin| | 2015-12-18 18:02 | 只看该作者
回复的有点少啊,楼主写的不错,继续加油!

使用特权

评论回复
11
pingis58|  楼主 | 2015-12-19 14:27 | 只看该作者
okyouwin 发表于 2015-12-18 18:02
回复的有点少啊,楼主写的不错,继续加油!

谢谢,后续会更EMWIN FATFS 和读取SD卡图片显示的

使用特权

评论回复
12
zhangbin_abc| | 2015-12-20 23:06 | 只看该作者
楼主你好,我在keil MDK中写好程序准备下载时下载不成功,查看keil中的配置 发现:


左边ST-link 是可以识别的,但是右边显示unknown target connected ,一下载就会提示这个,我电脑是win7的,请问你知道是什么问题吗?谢谢!

使用特权

评论回复
13
pingis58|  楼主 | 2015-12-21 08:38 | 只看该作者
本帖最后由 pingis58 于 2015-12-21 08:40 编辑
zhangbin_abc 发表于 2015-12-20 23:06
楼主你好,我在keil MDK中写好程序准备下载时下载不成功,查看keil中的配置 发现:

左边的ort:JTAG修改为 SWD试试。这是说明ST LINK已找到,但没有找到目标编程器件

使用特权

评论回复
14
zhangbin_abc| | 2015-12-21 22:41 | 只看该作者
pingis58 发表于 2015-12-21 08:38
左边的ort:JTAG修改为 SWD试试。这是说明ST LINK已找到,但没有找到目标编程器件 ...

的确是这个问题,谢谢解答。

使用特权

评论回复
15
jsww2008| | 2015-12-21 23:54 | 只看该作者
谢谢楼主分享

使用特权

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

本版积分规则

21

主题

131

帖子

3

粉丝