首页 > 编程知识 正文

stm32工业应用实例,stm32实例教程

时间:2023-05-04 18:33:14 阅读:16292 作者:784

本博客的撰写目的:一、自我总结、记录。 二、共享、输出、深化思考。 三、不要布局像小书一样。 那样的布局很漂亮,但是花了太多时间,有很多东西不需要说明。 完全可以自己解决,但尽量把版面设计好,方便阅读。 四、尽量举一反三,让实际问题真正得到处理。 有关下载stm32F1、stm32F4固件驱动程序包的信息,请打开本文。

3359 blog.csdn.net/xiaoeleis/article/details/105789061

STM32开发实战(一)

目录

一、概要、目的

二.构建步骤

三.钟表部分案例分析

四.理论总结

一、概要、目的

目的:解决STM32入门问题个人认为STM32最快、最直接的入门方法之一是从STM32CubeMx keilV5入手。 无论是采用FreeRTOS还是Keil提供的RTX,图形界面配置都有助于快速生成项目所需的基础架构代码,从而使您可以主要专注于项目需求的开发,大大提高开发效率。 上一段包含两个意思。 1、如果不熟悉STM32,如何获取相关技术知识。 2、如果不熟悉STM32,作为公司在职开发者,如何快速进入STM32相关项目开发业务,保证开发效率。 二.构建步骤

查看图并下载到官方网站或下载站: STM32CubeMX,MDK5(MDK-armv5 ) ) ) ) ) ) )。

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

初始界面如下所示,为图形引脚配置,点击鼠标即可。 so easy! 更详细的在后续章节里说。

左侧栏应先注意的几个问题:

1、可以选择是否使用自由RTOS

2、选择外部时钟时,请务必选择' RCC-HSE选项。 如果不如图所示进行配置,则无法更改输入频率输入选项。 系统时钟高达64MHZ,达不到72MHZ

3、SYS选项,时钟源默认看似SysTick,但实际上不起作用,需要重新选择,知道SYS标题为绿色,即选择成功。

自己摸索一下,看看网上的教程,比如“微雪教程”。 接下来,菜单栏上的项目生成代码

一些注意事项:

生成代码后,可以直接打开项目。

这是一个提示,表明未安装MDK-ARM V5。

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

三.钟表部分案例分析

对于单片机系统来说,CPU、总线和外围设备的时钟设置非常重要。 因为没有时钟就没有时机。 AHB总线,这是一条贯穿所有外围设备的总线,如上面的图中可以看到的,AHB通过桥接,APB1、APB2控制着大部分外围设备;

APB2是高速设备(控制着ADC、GPIO、EXIT、笑八宝粥1等外围设备) )。

APB1是低速设备; (例如,控制着DAC、经常笑的八宝粥x、USART、I2C等外围设备) )。

*很多人在说明知识的时候,这样说明,也有帮助吗? 反正我觉得没用。 我该怎么办? 看看我遇到的项目的例子。 我的同事使用的是STM32CubeMx生成的代码。 要将项目代码送到我这里进行集成,用于代码的延迟函数有两个HAL_Delay (,osDelay )。 理论上,这两个延迟函数的参数延迟标准都是ms (即HAL_Delay ) )。操作系统OSdelay(1000 )都表明延迟时间为1000ms,但要测试延迟时间是否正确。 因为在很多其他地方使用,对延迟精度的要求可能更高**。 示波器测试显示操作系统延迟(1000 )准确,Hal _ delay (1000 )的延迟实际上只有500ms,问题在哪里? 从图形配置部分可以看出,他设置的SYS时钟源是爱笑的八宝粥1,理论上与APB2的FCKL2相关。 首先,必须找到用于延迟函数的参数配置,然后查看源代码。

函数原型:

_ _ weakvoidhal _ delay (_ iou int 32 _ t delay ) ) ) ) ) ) ) 65

{

uint32_t tickstart=HAL_GetTick (;

wile () Hal _ get tick (-tickstart (delay ) )。

{

}

}

__weak uint32_t HAL_GetTick(void )

{

返回uw tick;

}

static __IO uint32_t uwTick;

__weak void HAL_IncTick(void )

{

优步;

}

void HAL_爱笑八宝粥_PeriodElapsedCallback (爱笑八宝粥_HandleTypeDef *htim )// 在 此文件下,定义了 爱笑的八宝粥_HandleTypeDef htim1;

{

HAL_IncT

ick();
}
–>
__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 爱笑的八宝粥1 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口。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。