历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2019年01月17日 | STM32:STM32学习记录2:跑马灯及仿真

2019-01-17 来源:eefocus

以下为自己编写的跑马灯程序,其中PA8和PD2连接LED


使用的是官方固件库3.4版本!!!!前提是配置好编译器才可以执行!!


配置流程:


1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。


2:IO口初始化,包括引脚,速率,输入输出模式等。


注意!!!


1:与51系列不同的是IO口还需要配置时钟,这是STM32省电的一种技巧。


2:IO口需设置为通用IO口,推挽输出。


    IO的输出配置可以是推挽模式和开漏模式,具体区别看参考手册108页。

    IO口的一般配置流程:

    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型


    特别注意用库函数的话一定要定义结构体类型!!!!!!!!不仅是GPIO像串口等等的初始化都需要定义结体,    具体类型可以查看官方库


    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化


3:关于系统时钟:系统时钟可以是外接晶振的倍频。我用9倍频!在官方库中选择好定义的宏,直接调用函数即可实现RCC的设置,具体频率设定由system_stm32f10xx.c(默认目录在ARM/Startup/ST)文件中得宏定义,开放哪一个宏,当调用SystemInit()库函数时,程序可以把频率设定好。


系统时钟的配置流程:


void RCC_Configuare(void)

{

    SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率

    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

}


流水灯的程序没啥说的了,各种文档满天飞。这里重点说明几点:


1:时钟系统,详细看《零死角玩转stm32-初级篇》 66页。

2:仿真:

首先是仿真设置,主要是设置外部晶振频率。


3:逻辑分析仪的使用

点逻辑分析仪----选setup---在Current Logic Analyser Signals中 添加 PORTA  然后选择下面 Display Type 中选bit即可


4:MDK中的空语句写法

__NOP();  注意前面是两杠  定义在core_cm3.h中


以下为原程序:

#include"stm32f10x.h"

 

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开

#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关

#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开

#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

 

//初始化IO端口

void IO_Configuart(void)   

{

    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟

 

    //配置GPIOA_8

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

 

    //配置GPIOD_2

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化

}

 

//复位和系统时钟控制

void RCC_Configuare(void)

{

    SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率

    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

}

 

void Delay(u16 speed)

{

    u16 i=0;

    while(speed!=0)

    {

        speed--;

        for(i=0;i<400;i++);

    }

}

int main(void)

{

    IO_Configuart();

    RCC_Configuare();

    while(1)

    {

        LED0_ON;

        LED1_OFF;

        Delay(2000);

        LED0_OFF;

        LED1_ON;

        Delay(2000);

    }

}



#include"stm32f10x.h"

 

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开

#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关

#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开

#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

 

//初始化IO端口

void IO_Configuart(void)   

{

    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟

 

    //配置GPIOA_8

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

 

    //配置GPIOD_2

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化

}

 

//复位和系统时钟控制

void RCC_Configuare(void)

{

    SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率

    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

}

 

void Delay(u16 speed)

{

    u16 i=0;

    while(speed!=0)

    {

        speed--;

        for(i=0;i<400;i++);

    }

}

int main(void)

{

    IO_Configuart();

    RCC_Configuare();

    while(1)

    {

        LED0_ON;

        LED1_OFF;

        Delay(2000);

        LED0_OFF;

        LED1_ON;

        Delay(2000);

    }

}


推荐阅读

史海拾趣

Conditioning Semiconductor Devices Corp公司的发展小趣事

为了进一步提升技术水平和扩大市场份额,CSDC积极寻求与国际半导体巨头的合作。通过与这些公司的技术交流和合作研发,CSDC不仅获得了先进的技术支持,还成功打入了国际市场。这一合作不仅提升了CSDC的品牌影响力,也为其带来了更多的商业机会。

DATEL Inc公司的发展小趣事

DATEL Inc.公司成立于1970年,总部位于美国马萨诸塞州。公司成立的初衷是解决当时数据采集领域的痛点,如数据准确性低、采集效率低下等问题。创始人带领一支由工程师组成的团队,开始研发第一代数据采集产品。他们日夜兼程,不断试验、调整,最终成功推出了一款体积小、功耗低、易于开发的数据采集器,这款产品迅速在市场中获得了认可。

ETERNA公司的发展小趣事

随着中国市场的崛起,ETERNA开始将目光投向了亚洲市场。2011年,中国从德国保时捷家族手中接过ETERNA的旗帜,开始在全球大力拓展ETERNA品牌。在中国市场的推动下,ETERNA的知名度和影响力不断提升。同时,公司还加强了与其他国家和地区的合作与交流,通过参加国际展会和举办品牌活动等方式,进一步扩大了品牌影响力。这些努力使ETERNA在全球电子行业中逐渐崭露头角,成为了一个备受瞩目的品牌。

Exclara Inc公司的发展小趣事

随着LED技术的不断发展和市场需求的不断变化,Exclara看到了新的市场机遇。公司凭借在LED领域的技术积累和市场经验,成功进军了智能家居、智能照明等新兴市场。在这些新兴市场中,公司凭借其独特的技术优势和创新能力,迅速获得了市场份额和客户的认可。面对新的市场挑战和机遇,Exclara将继续保持创新精神和技术实力,为电子行业的发展贡献更多的力量。

请注意,以上故事框架仅供参考,具体内容和细节需要根据实际情况进行补充和完善。

Greenlee公司的发展小趣事

为了寻求新的增长点,GREEGOO公司开始尝试跨界合作。公司与一家知名汽车制造商达成合作协议,共同研发车载智能娱乐系统。通过整合双方在电子技术和汽车制造领域的优势资源,成功推出了多款具有创新性和竞争力的车载智能产品。这一跨界合作不仅为GREEGOO带来了新的业务增长点,还进一步提升了公司在电子行业中的影响力和地位。同时,也为公司未来的多元化发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在模拟“GREEGOO”公司可能的发展路径和故事。在实际的电子行业中,不同公司的发展经历和故事各不相同。

AEC Design公司的发展小趣事
在初步获得市场认可后,AEC Design公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司的产品线逐渐覆盖更广泛的消费群体。同时,公司还积极参加各类行业展会和论坛,与业界同行交流学习,不断提升自身的品牌影响力和市场竞争力。

问答坊 | AI 解惑

H.264和 MPEG-4两种标准关系

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 一、H.264概述与MPEG-X的区别 随着市场的需求,在尽可能低的存储情况下获得好的图像质量和低带宽图像快速传输已成为视频压缩的两大难题。为此IEO/IEC/和ITU-T两大国际标准化组织联手制定了新一 ...…

查看全部问答>

GAIA DC/DC converter

GAIA模块知识简介:     1、公司简介:          GAIA公司成立于1987年,原来是法国汤母讯公司的电源研发部,原本开发产品低同应汤母逊公司需求,越做越大,后成立GAIA公司,公司获得欧洲军标DE ...…

查看全部问答>

青越锋软件的常见操作问题----(原理图)

1、为什么我“Open”或是“Import”打不开项目文件啊? 答:我们对于项目文件和单个文件的打开是有区别的。“Open”是打开以我们青越锋软件保存的文件,“Import”则是导入其他文件的格式,目前支持ASCII格式。而打开项目则是通过“Project”来处 ...…

查看全部问答>

51单片机小精灵,据说不懂单片机也能编程

本帖最后由 paulhyde 于 2014-9-15 09:05 编辑 51单片机小精灵,据说不懂单片机也能编程 其实就是一些小工具的合集,看了下,还是挺实用的软件  …

查看全部问答>

lpc1114开发板原理图

lpc1114开发板原理图…

查看全部问答>

请教:电话的听筒是130欧姆,我设置了一个电话板,怎么修改耳机电路才能用30欧姆的耳机?

用的电话芯片是TEA1062, SPK终于电容C接到耳机上; SPK与GAR之间有电阻R。 试验发现: R=100K,C=1UF时,用电话听筒质量非常好;但是用30欧姆耳机的话,噪声严重,并且有破声。 R=100K,C=0.1UF时,用电话听筒质量非常好;用30欧姆耳机的 ...…

查看全部问答>

新手求助(如何在一个inf文件里指定两类设备)

求助: 小弟想在一个inf文件中安装两个driver,但又不想在device管理里显示为一种设备类,想把两个driver分别显示在两个不同的device类中,不知如何是好?.望不吝赐教! 感激不尽! …

查看全部问答>

VHDL integer装换为real的问题

我想转换integer类型的信号为real类型 程序如下。 这段程序在maxplus II报错: file standard.vhdl:Unsupported feature error:floating is not supported 在quartus II中报错: Error (10414): VHDL error at yuvtorgb.vhd(22), at object \" ...…

查看全部问答>

红外无线耳机

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 由于感应式无线耳机的发射电路必须固定安装在房间的墙壁或天花板上,故无法在室外使用,这是感应式无线耳机的主要缺点。而红外无线耳机则不然,由于它的信号发射采用小巧的红外发射电路,既可 ...…

查看全部问答>

使用大容量STM32F10xxx的FSMC

这个应用笔记说明了如何使用大容量的STM32F10xxx的FSMC(灵活的静态存储器控制器)驱动一组外部的存储器。文中首先简要地介绍了STM32F10xxx的FSMC控制器,然后给出了包含典型的FSMC配置的存储器接口实例,以及时序计算和硬件连接方法。 本应用 ...…

查看全部问答>