TA的每日心情 | 开心 2018-7-5 13:19 |
---|
签到天数: 70 天 连续签到: 1 天 [LV.6]常住居民II
|
本人以前并没有真正使用过stm32的产品,曾经使用过AVR和几款ARM Cortex M0内核的单片机,STM32F769i和之前所用的单片机相比算高端的了。此次有幸拿到STM32F769i_Disco体验机会,将和大家分享作为一个新手我是如何学习这款单片机的。
首先我想要知道那个开发板有哪些外围资源,可以用来做哪些应用?带着这个问题从官网找到STM32F769i_Disco的用户手册。
在第一章特征里,我知道一些芯片的基本情况:flash很大,有2m;ram也很大。独立的跑RTOS都绰绰有余。
和现在主流的开发板一样板上提供了编译器和虚拟串口,下载、调试程序还是比较方便的。
有一块4寸的触摸屏,mipi接口的,通过后面学习,还支持ltdc,和fmc控制带驱动器的TFT-LCD。后面再介绍方案比较。
之后是音频部分的,支持SAI和SPDIF,还提供了4个MEMS麦克风,我想着重看看这个,各人感觉数字麦克风更适合麦克风阵列,在语音识别等开发的优势会比较明显。
再下面,提供了片外的flash和ram,增加存储空间和处理速度。做GUI时很关键。
最后是USB OTG 和以太网,很有用,也是很早有应用的,不多说了
对硬件有了大致认识后,向下看具体的分布图,进一步加深印象
这个文档的后面是各个接口的定义,和原理图,实际使用时很有用,同时下载了原理图文件,AD查阅起来更方便一些。
大致了解可以干什么后,我们来上电看看,手册6.4说明了板子的不同供电方式。我用STlink供电,CN3接口跳线帽位于stlk。
上电后,运行板载默认的例子,简单玩一玩,不多讲。后面要研究数字麦克风,试了试例子中的录音功能。
点击录音图标提示:”usb not ready”,需要准备一根otg线,外接个u盘存储录音文件。找一根usb延长线和micorusb数据线,按线颜色顺序连接即可。连接好otg线和u盘后,显示“press [record] to start”可以开始录音了
听一听录音效果,挺不错了,没有什么噪音,感觉比普通驻极体录出来的稍好一点。不专业啊,只是个人感觉。
简单玩一玩之后,进入下一个问题:软件上如何开始学习?根据以前的学习经验,我一般先找官方提供的各个功能的样例,实际下载到板子上跑一跑,熟悉熟悉编译环境、下载工具、调试工具等,工具类的软件基本熟悉了之后,再分析分析样例的代码,照猫画虎学习功能模块和库函数的使用。
本着这个原则,我找到了stm32cubef7固件库,在projects中有f7各个型号开发板的实例。点开STM32F769I-Discovery,我们来看一看目录app中是功能模块的应用实例,demo是出厂带的例子。Examples是单片机外设的实例,templates是hal库的模板,Templates_LL是ll库的模板。
我们进到Demonstration中看一看,有几个目录,第一个Binary中存了两个文件,是编译好的样例程序,STM32CubeDemo_STM32769I-DISCO_V1.3.0和样例工程对应。STM32769I-DISCO_DEMO_V1.0.0_FULL没有提供代码,而且文件超大100多mb,想必内容丰富。Config和core没有深入研究,再后面是对应不同开发环境的工程。
选择mdk的工程,首先我们来看readme.Txt,文档中有关于这个例子的功能描述和一些配置说明,这个的作用还是很大的,能帮助我们快速定位是不是自己想要的实例,然后再深入学习代码。
在readme中,简单介绍后,说了有Audio、Video、Audio Recorder等8个功能界面,最后说mdk不支持下载外部flash,用STM32 ST-LINK Utility可下载内部flash和外部flash。
那我们就安装STM32 ST-LINK Utility,和st link的驱动,然后下载Binary中两个文件看一看。
打开软件,然后按照reaeme中的介绍操作,先添加外部flash,然后连接stlink,随后设置下载文件,完成下载。
In order to program the demonstration you must do the following:1- Open STM32 ST-Link Utility, click on "External Loader" from the bar menu then check "MX25L512G_STM32F769I-DISCO" box 2- Connect the STM32F769I-DISCO board to PC with USB cable through CN163- Use "STM32CubeDemo_STM32769I-DISCO_V1.3.0.hex" file provided under “Binary” with STM32 ST-Link Utility to program both internal Flash and external QSPI memory. The "STM32769I-DISCO_DEMO_V1.0.0_FULL.hex" file provided under “Binary”, can also be used to take benefit from Touch-GFX and EmbeddedWizard third parties demonstrations modules replacing Gardening control and Home alarm modules. 4- copy the audio and video files provided under "Utilities/Media/" in the USB key5- Plug a USB micro A-Male to A-Female cable on CN15 connector6- Plug a headphone into CN7 Connector.-> The internal Flash and the external QSPI are now programmed and the demonstration is shown on the board. 下载的过程还是挺漫长的,文件太大了。
解了下载操作之后,我们还是找一个简单的工程,来分析分析。我们打开\Examples\GPIO实例。还是先看readme,它说PA.0(user)是外部中断,按下后LED2翻转。
打开后编译,编译的时间也挺长的,然后下载,这次直接下载到内部flash中可以了,使用mdk下载。
效果就是按下蓝色按键,LED2翻转。
接下来我们来分析分析代码,首先看主函数,hal库初始化,然后配置时钟,之后配置LED2为输出,最后配置外部中断。
int main(void){ /* Enable the CPU Cache */ CPU_CACHE_Enable(); /* STM32F7xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 216 MHz */ SystemClock_Config(); /* -1- Initialize LED2 */ BSP_LED_Init(LED2); /* -2- Configure EXTI0 (connected to PA.00 pin) in interrupt mode */ EXTI0_IRQHandler_Config(); /* Infinite loop */ while (1) { }}我么来看看LED2配置和中断配置
void BSP_LED_Init(Led_TypeDef Led){ GPIO_InitTypeDef gpio_init_structure; LEDx_GPIO_CLK_ENABLE(); /* Configure the GPIO_LED pin */ gpio_init_structure.Pin = GPIO_PIN[Led]; gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_structure.Pull = GPIO_PULLUP; gpio_init_structure.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIO_PORT[Led], &gpio_init_structure);} 创建一个gpio的结构体,然后配置参数,最后初始化。不必多讲
static void EXTI0_IRQHandler_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOC clock */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* Configure PC.13 pin as input floating */ GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); /* Enable and set EXTI line 0 Interrupt to the lowest priority */ HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);} 然后外部中断,也是一样的模式,创建结构体,设置参数,初始化,gpio设置完后,配置exti0的优先级,最后使能。
接下来看看中断函数的内容。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if (GPIO_Pin == GPIO_PIN_0) { /* Toggle LED2 */ BSP_LED_Toggle(LED2); }}说GPIO_PIN==GPIO_PIN_0灯就翻转,看看GPIO_PIN_0是什么?
#define GPIO_PIN_0 ((uint16_t)0x0001U) /* Pin 0 selected */就是说按键为高电平就触发中断了,我们再看看原理图确实是下拉的按键。
到此分析完毕,总结下,我们由大及小,先了解了硬件的一些功能,然后学会了下载demo,最后分析单一外设的demo。后续再学习更多的外设,将多个外设集成起来使用就构成了某一功能。谁也不能一口吃个胖子,知识需要静下心来一点点的积累,但是在学习的过程中格局还是要高一些,学习的方向才不会错,少走弯路。当问题很大时,试着分成多个小的问题,逐个解决;而当问题很多时,又要试着总结问题,从宏观上确定解决问题的方向或方法,而不是去解决具体某一问题。一点点感受分下给大家,见笑,希望和大家共同学习成长, |
|