如何生成stm32单片机程序

如何生成stm32单片机程序,第1张

1,下面以流水灯为例说明STM32CubeMX软件的使用。

2,

第一步,建立并保存工程。

3,启动STM32CubeMX软件,界面如图2所示。

4,点击New

Project,在New

Project对话框中选择Board

Selector标签页,在这里有各种ST评估板可以选择,我们选择STM32F429I-DISCO,最后点击OK,如图3所示。这样就建立起了STM32F429I-DISCO评估板的工程,这个工程已经根据评估板设置好了,然后可以生成相应的代码。

5,为了演示如何使用STM32CubeMX软件,关闭刚刚建立的工程,从头建立一个新的工程。点击New

Project,在New

Project对话框中选择Mcu

Selector标签页,然后在MCU

Filter中依次选择STM32F4,STM32F429/439,在下面列表中选择STM32F429ZITx,最后点击OK,如图4所示。

6,新建立的工程界面如图5所示。

在使用STM32微控制器时,需要通过配置系统时钟来确保微控制器的正常工作。一般情况下,配置系统时钟是非常重要的,因为它决定了微控制器的主频、计时器、外设和各种时序等参数,以及系统整体性能的稳定性和准确性。

然而,在一些特定的情况下,STM32微控制器可以不用手动配置系统时钟。例如,在某些开发板或参考设计中,已经默认配置好了系统时钟,并将其作为一个预定义的硬件选项。这种情况下,用户只需按照开发板或参考设计的说明书进行连接和调试,系统时钟就不需要再次进行手动配置。

此外,STM32微控制器的一些型号还提供了内部低速晶振,它们可以自动启动并提供一些基本时钟信号 (例如LSI、LSE、HSI和HSE) ,从而避免了手动配置系统时钟的麻烦。这些内部低速晶振的优点在于延长电池寿命、减小电路占用面积、减少成本等方面都有所帮助。

总之,虽然STM32微控制器通常需要手动配置系统时钟,但在某些特殊情况下,可以不用手动配置系统时钟。该决定是否需要手动配置系统时钟,还取决于具体的硬件设计和应用需求。

stm32单片机可以用Keil5、STM32CubeIDE、IAR等进行编程。

1、Keil MDK:Keil支持目前大多数单片机,Keil根据不同内核单片机,分为几个版本,最常用的就是Keil C51和MDK-ARM。像STC和一些51内核的单片机,一般用KeilC51版本,STM32则用的MDK-ARM。

2、STM32CubeIDE:STM32CubeIDE是ST公司推出的免费多功能STM32开发工具,可以说专门为STM32而生,新增了很多STM32专用功能,比如说外设图形化配置。为工程师大大提高开发效率,降低开发成本。

3、IAR:IAR我是在开发Ti蓝牙产品和基于STM8单片机会用到的。IAR也可以用来开发STM32的程序。通过IAR编译出来的程序比Keil优化得更好,最直接的体现就是编译出来的程序更节约内存空间。和上面Keil类似,IAR同样支持很多单片机,有很多功能基本两者都有。

STM32的介绍:

在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。

内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。

意法半导体(STMicroelectronics)整个集团共有员工近50000名,拥有16个先进的研发机构、39个设计和应用中心、15主要制造厂,并在36个国家设有78个销售办事处。

实现10ms定时需要使用STM32的定时器模块,并且要将系统时钟频率设置为足够高的值。以下是实现10ms定时的步骤:

设置系统时钟:使用RCC寄存器设置PLL倍频系数,将系统时钟频率设置为72 MHz。

选择合适的定时器:在STM32中有多个定时器可供选择,根据需要选取合适的定时器。假设在这里我们选用TIM2定时器。

配置定时器:使用TIM2的相关寄存器配置定时器的时钟源、分频系数和计数周期等参数。可以将定时器的时钟源设置为内部时钟,将分频系数设置为7200,则每秒钟定时器计数器会自增100次。

启动定时器:将TIM2的控制寄存器使能,并设置定时器计数器初值为0。

编写中断服务程序:在定时器溢出时会产生中断请求,在中断服务程序中可以进行相应的 *** 作。例如,可以使用GPIO输出引脚控制LED闪烁。

启用全局中断:调用__enable_irq();函数启用全局中断

在以上代码中,使用了TIM2定时器,并将计数周期设置为100,即每秒钟会产生10次溢出中断。在中断服务程序中,控制LED引脚状态的改变,从而实现了10ms的定时效果。

#include "stm32f10xh"

void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)

{

//定时器中断执行的内容

GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

}

}

int main(void)

{

//开启GPIOC时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

//配置LED引脚为推挽输出模式

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructureGPIO_Pin = GPIO_Pin_13;

GPIO_InitStructureGPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

//开启TIM2时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

//设置定时器参数

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

TIM_TimeBaseInitStructTIM_Prescaler = 7200-1; //预分频系数

TIM_TimeBaseInitStructTIM_Period = 100-1; //自动重载计数值

TIM_TimeBaseInitStructTIM_ClockDivision = TIM_CKD_DIV1; //时钟分割

TIM_TimeBaseInitStructTIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

//使能TIM2中断

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

//启动TIM2定时器

TIM_Cmd(TIM2, ENABLE);

//注册中断服务程序

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructureNVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructureNVIC_IRQChannelSubPriority = 0;

NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//启用全局中断

__enable_irq();

while(1)

{

//主循环程序

}

}

GD32F103移植STM32程序时,程序中有一段需要关闭定时器来保护变量不被修改,如下:

在STM32上运行没有问题,但放到GD32上运行不了,定时器起不来。需要改成如下关闭中断。

以上就是关于如何生成stm32单片机程序全部的内容,包括:如何生成stm32单片机程序、stm32为什么不用配置系统时钟、stm32用什么软件编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10053033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存