发 帖  

[经验] 嵌入式STM32开发入门及实战 (1)

2018-6-13 14:05:29  691
收藏 0 收藏 推荐 0 推荐
分享
本帖最后由 一只耳朵怪 于 2018-6-13 14:14 编辑

STM32开发实战 (1)
目录
一、概述,目的
二、搭建步骤
三、时钟部分案例分析
四、理论总结
一、概述,目的
目的:解决STM32入门问题

个人认为STM32的最快,最直接的入门方法之一就是:从STM32CubeMx+keilV5入手。无论 你采用FreeRTOS还是Keil自带的RTX,通过图形化的界面配置,都能快速生成项目所需的基础层架构代码,从而将主要精力用于自身项目需求开发上,大大提高开发效率。

上一段话包含两层意思:1、在不熟悉STM32的情况下,如何入手学习相关的龙8娱乐城官网知识。2、在不熟悉STM32的情况下,作为公司在职开发人员,如何快速进入STM32相关的项目开发工作中,保证开发效率。
二、搭建步骤
看图去官网或者下载站下载:STM32CubeMX,MDK5(MDK-ARM V5)
安装完成后,就可以选择你要使用的具体芯片型号,本篇芯片为stm32030系列 、stm32103系列

初始界面如下,图形化的管脚配置,点点鼠标就可以,so easy!更深入的在后续章节再说。
左侧栏先要注意的几个问题:
1、你可以选择是否使用FREERTOS
2、如果选择外部时钟,请务必选择 “RCC-HSE 选项,如图配置”否则 Input frequency 输入选项不可更改,系统时钟最高只能为64MHZ,达不到72MHZ
3、SYS选项,时钟源虽然默认看起来是SysTick,但实际上没起作用,所以,需要重新选择一次,知道SYS标题变绿色,即选择成功。


自己摸索一下,看看网上的教程,比如“微雪教程”。然后,菜单栏 project->Generate code

注意一些相关提示:


生成代码之后,就可以直接打开工程了。
这是没有安装MDK-ARM V5的提示:
打开工程后默认的项目文件列表:
三、时钟部分案例分析
  对于单片机系统来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序。
*AHB总线,这是贯穿所有外设的一条总线,上图可知:AHB经过桥接,由APB1、APB2控制着几乎所有外设;
APB2属于高速设备; (控制着如:ADC、GPIO、EXIT、TIM1等外设)
APB1属于低速设备; (控制着如:DAC、TIMx、USART、I2C等外设)*
**很多人在讲解知识时,如上作以解释,有用吗?反正我觉得是没用。那怎么做更好呢?
看一个我碰到的项目实例:一同事在用STM32CubeMx生成的代码,要交到我这里来对项目代码进行整合,代码里用到的延时函数有两个HAL_Delay(), osDelay(),理论上,这两个延时函数的参数延时基准都是ms,也就是说HAL_Delay(1000), osDelay(1000)都表示延时1000ms,但是我还是要测试一下延时是否准确,因为还有其他好多地方要用到,而且对延时精度要求可能更高点**。
通过示波器测试得知osDelay(1000)是准确的,而HAL_Delay(1000)的延时值实际只有500ms,问题在哪呢?通过图形配置部分,得知他设置的SYS 时钟源为TIM1,那么,理论上是和APB2的FCKL2相关。我们先定得找到延时函数所用到的参数配置,看源代码:
函数原型:
__weak void HAL_Delay(__IO uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay)
{
}
}
–>
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
–>
static __IO uint32_t uwTick;
__weak void HAL_IncTick(void)
{
uwTick++;
}
–>
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 在 此文件下,定义了 TIM_HandleTypeDef htim1;
{
HAL_IncTick();
}
–>
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/Configure the SysTick to have interrupt in 1ms time basis/ // 1ms 中断 时基
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/Configure the SysTick IRQ priority/
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0);
/* Return function status */
return HAL_OK;
}
–>
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
……// 此处省略
/* Compute TIM1 clock */
uwTimclock = HAL_RCC_GetPCLK1Freq(); // 开始这里用的PCLK1
……// 此处省略
}
uwTimclock = HAL_RCC_GetPCLK1Freq(); // 开始这里用的PCLK1,显然不符合理论要求
串口输出调试信息:
DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq());
DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000
PCLK2Freq 18000000
uwTimclock = HAL_RCC_GetPCLK2Freq();// 这里修改后,测试延时仍然不正确,为什么?PCLK2Freq 18000000 频率是不对的,而要修改PCLK2Freq的值,无非就是修改APB2的分频值。本来是可以直接再图形配置这里直接修改的,但是我要做代码整合,很多代码自动升后,修改不方便,就直接通过源码修改。在系统时钟初始化函数里,如下:
SystemClock_Config(void)
{
……// 此处省略
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 这里修改RCC_HCLK_DIV4 –> RCC_HCLK_DIV1
……// 此处省略
}
串口输出调试信息:
DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq());
DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000
PCLK2Freq 72000000
再次测试,结果就正确了。
上边的问题说明三点:
1、虽然定时器(Timer)1是由APB2的PCLK2提供的时钟输出,但是解决问题的办法并不是死的,所以由HAL_RCC_GetPCLK1Freq();提供的频率输出,结果不会错误,然而不符合理论要求:所以还是要在源
头修改。特别是整合程序时,基本我不再用STM32CubeMX去自动生成代码,不然很多代码被自动修改,会造成很大麻烦。
2、STM32CubeMX生成的代码,有可能存在BUG,所以调试需全面考虑。
3、在不用手册,通过观察CubeMX图形配置部分,然后明确具体有关时钟总线,外设关系的情况下,就可以找到代码的问题所在。
然后参照上图详细总结一下系统时钟的关系如下:
其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。
  STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。
  另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。
  系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:
  ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。
  ②、通过8分频后送给Cortex的系统定时器时钟。
  ③、直接送给Cortex的空闲运行时钟FCLK。
  ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。
  ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。
  在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。
  需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。
  连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
  连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。
嵌入式学习交流群:201030910

收藏 0 收藏 推荐 0 推荐
lee_st 2018-6-14 08:34:33
简单明了
回复 举报
lee_st 2018-6-14 08:34:40
看看了
回复 举报
stm32f072 2018-6-14 19:41:34
好的东西 相互交流 用的广泛哦
回复 举报
慧心的眼眸 2018-6-19 13:30:59
                              
回复 举报
wanglintang 2018-6-21 15:25:55
学习学习学习学习学习
回复 举报
braveheart081 2018-6-22 15:43:17
看看吧,不知道什么
回复 举报
heng19810 2018-8-7 14:36:45
感谢楼主分享   
回复 举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册
发经验
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

龙8娱乐城官网干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM龙8娱乐城官网论坛

Linux论坛

单片机/MCU论坛

MSP430龙8娱乐城官网论坛

FPGA|CPLD|ASIC论坛

STM32/STM8龙8娱乐城官网论坛

NXP MCU 龙8娱乐城官网论坛

DSP论坛

嵌入式系统论坛

-

电源龙8娱乐城官网论坛

电源龙8娱乐城官网论坛

无线充电龙8娱乐城官网

-

硬件龙8国际下载论坛

电路龙8国际下载论坛

电子元器件论坛

传感龙8娱乐城官网

总线龙8娱乐城官网|接口龙8娱乐城官网

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量龙8娱乐城官网专区

-

EDA龙8国际下载论坛

multisim论坛

PCB龙8国际下载论坛

PADS龙8娱乐城官网论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

Orcad论坛

-

综合龙8娱乐城官网与应用

电机控制

工程资源中心

汽车电子龙8娱乐城官网论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

物联网龙8娱乐城官网

天线|RF射频|微波|雷达龙8娱乐城官网

-

IC龙8国际下载论坛

芯片测试与失效分析

Analog/RF IC龙8国际下载

龙8国际下载与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测龙8娱乐城官网与质量

电磁兼容(EMC)龙8国际下载与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机龙8娱乐城官网论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

高校联盟

深圳大学电子协会

西藏民族学院电子龙8国际下载协会

西安电子科技大学西电实验室

桂林电子科技大学机电工程协会

鉴鹰电子科技协会

广东海洋大学科技创新协会

福建农林大学电子科技创新协会

湖北理工学院电子龙8娱乐城官网协会

深圳职业龙8娱乐城官网学院电子精英训练营

浙江科技学院Zuster

湘潭大学电子科技协会

青岛理工大学琴岛学院天宏开发团队

河南理工大学大学生电器开发部

广西科技大学电气信息创新协会

浙江机电职业龙8娱乐城官网学院电子制作协会

郑州大学西亚斯国际学院爱电工作室

新乡学院电子创新工作室

洛阳理工学院SmartTeam

苏州工业职业龙8娱乐城官网学院创新工作室

浙江工业大学GC315团队

杭电-微芯大学生科技创新孵化器

西安工业大学电信科协

商洛学院科技创新协会

大连民族学院创新工作室

南京信息工程大学帆木工作室

-

供求信息发布

方案交易

供需广告

芯片求购|供应发布区