本博客的编写目的:
一、自我总结,记录。
二、分享,输出,加深思考。
三、不作细致如书本般编排,尽管那样的排版很好看,但是过于耗费时间,还有很多东西没有必要说明,完全可以自己去解决,但还是尽量做好排版,便于阅读。
四、尽可能举一反三,做到真正能够处理实际问题。
1
2
3
4
5
STM32开发实战 (1)
目录

一、概述,目的
二、搭建步骤
三、时钟部分案例分析
四、理论总结

一、概述,目的

目的:解决STM32入门问题

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

上一段话包含两层意思:1、在不熟悉STM32的情况下,如何入手学习相关的技术知识。2、在不熟悉STM32的情况下,作为公司在职开发人员,如何快速进入STM32相关的项目开发工作中,保证开发效率。
1
2
3
4
5
二、搭建步骤

看图去官网或者下载站下载:STM32CubeMX,MDK5(MDK-ARM V5)
1

安装完成后,就可以选择你要使用的具体芯片型号,本篇芯片为stm32030系列 、stm32103系列

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

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

注意一些相关提示:

生成代码之后,就可以直接打开工程了。

这是没有安装MDK-ARM V5的提示:

打开工程后默认的项目文件列表:

三、时钟部分案例分析

对于单片机系统来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序。
1
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,但是我还是要测试一下延时是否准确,因为还有其他好多地方要用到,而且对延时精度要求可能更高点

1
2
通过示波器测试得知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口。

作者:xiaoeleis
来源:CSDN
原文:https://blog.csdn.net/xiaoeleis/article/details/70919552
版权声明:本文为博主原创文章,转载请附上博文链接!

STM32开发入门及实战相关推荐

  1. STM32开发入门及实战 (1)

    本博客的编写目的: 一.自我总结,记录. 二.分享,输出,加深思考. 三.不作细致如书本般编排,尽管那样的排版很好看,但是过于耗费时间,还有很多东西没有必要说明,完全可以自己去解决,但还是尽量做好排版 ...

  2. 《Android 开发入门与实战(第二版)》——6.6节配置改变

    本节书摘来自异步社区<Android 开发入门与实战(第二版)>一书中的第6章,第6.6节配置改变,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区&qu ...

  3. BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...

  4. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  5. Android自定义控件开发入门与实战(1)绘图基础

    今天从leader那里拿到了启舰大神写的<自定义控件开发入门与实战>这本书,据说看完了,至少写起自定义view也不会慌. 最重要的是多练,所以这本书基本设计到的我没有涉及过的控件开发(之前 ...

  6. Google Android开发入门与实战

    Google Android开发入门与实战 [作 者]靳岩;姚尚朗 [同作者作品] [作译者介绍]  [出 版 社] 人民邮电出版社     [书 号] 9787115209306  [上架时间] 2 ...

  7. 《Android 开发入门与实战(第二版)》——导读

    本节书摘来自异步社区<Android 开发入门与实战(第二版)>一书中的目录,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区"异步社区&quo ...

  8. 《Google Android 开发入门与实战》

    <Google Android 开发入门与实战>(含1张DVD光盘) 市 场 价:¥55 书 号:9787115209306 出版日期:2009 年6月 开 本:16开 页码:340 [内 ...

  9. Android开发入门与实战之Android应用安装卸载

    当一个Android开发者完整的开发完毕一个程序应用软件结束后要进行软件测试,这就是软件测试员的来历,那么在这之前,要进行Android开发应用的安装与卸载. Android开发入门与实战之Andro ...

最新文章

  1. 智课雅思词汇---十、pend是什么意思
  2. 梯度爆炸是什么?有什么后果?如何判断梯度爆炸?如何避免梯度爆炸?
  3. INFO ipc.Client:Retrying connect to server 9000
  4. tomcat的热部署
  5. Linux时间子系统之二:表示时间的单位和结构【转】
  6. php5+init,PHP mysqli_stmt_init() 函数
  7. 记录一次通过抓包解决Zabbix no active checks on server
  8. Kubernetes详解(二十一)——ReplicaSet控制器实战应用
  9. pathway一些网站
  10. 一次通过PMP认证考试的心得分享
  11. 当c语言学到大成时,教孩子学编程(信息学奥赛C语言版)
  12. 单片机c语言 教案,《单片机C语言》 课程教案.doc
  13. 服务器主机防护系统有哪些,什么是DDoS防护主机?
  14. 动手打造N合1操作系统安装光盘
  15. 激活 visio Premium 2010 vol 版本
  16. 利用高斯(Guass)算法求解2维的SVP向量
  17. 第四章 软件架构演化
  18. xp未受用户在此计算机登录,XP系统无线网络连接受限制或无连接的解决办法
  19. Depix:还原马赛克工具的试用及总结
  20. 【财经】同程网 -- 盈利模式

热门文章

  1. Java API常用package介绍
  2. pyltp安装的一系列过程
  3. 主成分分析(PCA)原理及R语言实现及分析实例
  4. 使用码上登录实现微信扫码登录
  5. Webuploader教程(一)------简单实用上传功能
  6. 客户/供应商主数据批导
  7. windows下的grep
  8. 手把手教你开发photoshop面板插件(附demo和工具)
  9. 盘点常见的7种网络安全威胁
  10. MySQLSyntaxErrorException