历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | STM32嵌入式开发学习笔记(一)

2020-02-22 来源:eefocus

本文中,笔者将介绍使用嵌入式开发工具Keil uVision5,使用C语言,对微处理器STM32F103C8进行嵌入式开发。


开发使用C语言,首先需要新建一个C语言文件,将其设为主函数的入口,因此,将此文件命名为main.c


配置好软硬件依赖环境后,在此文件中键入如下内容,尝试编译,如果能够编译成功说明环境配置成功。


stm32f10x.h库的功能是提供对于stm32f10x系列开发板的所有功能的定义与实现,因此在头文件中要加一句。


#include

#include

int main(){


    return 0;

}

实验1:让小灯常亮


查阅STM32技术手册,可知管脚A1-4是用于控制小灯的,然而,要操控管脚A1-4,我们要先使能GPIOA的时钟信号


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

然后,我们定义一个GPIO结构体,用于操控小灯


GPIO_InitTypeDef GPIO_LED_INIT;

根据技术手册,GPIO_InitStruct类型结构体有以下三个成员:


typedef struct

{

    u16 GPIO_Pin;

    GPIOSpeed_TypeDef GPIO_Speed;

    GPIOMode_TypeDef GPIO_Mode;

} GPIO_InitTypeDef; 

分别代表控制哪个或哪些管脚,信号速率和工作状态。


其中,工作状态分为输入和输出,输出状态又分为(复用)开漏输出,(复用)推挽输出。


我们在此实验中仅操控第1个led灯,因此只操控时钟GPIOA控制下的管脚1,信号速率设置为2MHz,工作模式设置为推挽输出。


GPIO_InitTypeDef GPIO_LED_INIT;

GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1;

GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP;

然后我们根据以上设置初始化此结构体,并用GPIO的置位函数,令管脚输出信息,从而让小灯亮起。


GPIO_Init(GPIOA,&GPIO_LED_INIT);

GPIO_SetBits(GPIOA,GPIO_Pin_1);

实验2:让四个小灯同时闪亮


想同时操控多个小灯,只需要将GPIO_Pin的参数按位或起来。


GPIO_Pin是一个无符号16位整数,实际上,它的每一位表示一个时钟控制下16个管脚的开闭,0代表无信号,1代表有信号。


GPIO_Pin_x的宏定义,实际上也是一个16位整数,某一位为1,其他位为0


GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

要让小灯闪亮,其亮灭的时间就必须有一定延迟,人眼才能看出。在嵌入式开发中无法使用Sleep()函数,因为Sleep()函数依赖于操作系统的时钟。


因此,要手写一个函数阻塞开发板处理器的运行。


void Delay(int time){

    for(int i=0;i        for(int j=0;j<100000;j++);

}

要让小灯亮灭延迟时,调用此阻塞函数即可。


while(1){

    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); 

    Delay(500); 

    GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); 

    Delay(500); 

}

实验3:流水灯


流水灯就是让小灯依次亮起,稍微修改一下闪灯的程序即可。


    while(1){

        GPIO_SetBits(GPIOA,GPIO_Pin_1);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_1);

        GPIO_SetBits(GPIOA,GPIO_Pin_2);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_2);

        GPIO_SetBits(GPIOA,GPIO_Pin_3);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_3);

        GPIO_SetBits(GPIOA,GPIO_Pin_4);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_4);

    }

本实验完整代码:


#include

#include

void Delay(int time){

    for(int i=0;i        for(int j=0;j<1000;j++);

}

void blingbling(){

    while(1){

        GPIO_SetBits(GPIOA,GPIO_Pin_1);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_1);

        GPIO_SetBits(GPIOA,GPIO_Pin_2);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_2);

        GPIO_SetBits(GPIOA,GPIO_Pin_3);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_3);

        GPIO_SetBits(GPIOA,GPIO_Pin_4);

        Delay(500);

        GPIO_ResetBits(GPIOA,GPIO_Pin_4);

    }

}

void hualahuala(){

    while(1){

            GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); 

            Delay(500); 

            GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); 

            Delay(500); 

    }

}

int main(){

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    

    GPIO_InitTypeDef GPIO_LED_INIT;

    GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

    GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz;

    GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP;

    

    GPIO_Init(GPIOA,&GPIO_LED_INIT);

    blingbling();

    return 0;

}


推荐阅读

史海拾趣

Afero公司的发展小趣事

随着Afero在国内市场的成功,公司开始将目光投向国际市场。他们设立了海外分支机构,积极参加国际展会和技术交流活动,与全球范围内的合作伙伴建立联系。通过与国际知名企业的合作,Afero成功将其物联网平台推广至全球市场,并获得了广泛的认可和应用。这些国际市场的拓展为Afero的未来发展打开了新的机遇。

这些故事是基于Afero公司的发展历程和公开信息构建的,旨在展示其在电子行业中的发展和成就。然而,需要注意的是,这些故事可能并不完全准确或详尽,因为具体细节可能涉及公司的商业机密或未公开的信息。如需更详细和准确的信息,建议直接访问Afero公司的官方网站或查阅相关新闻报道。

AUREL公司的发展小趣事

随着电子市场竞争的加剧,AUREL公司意识到单纯的技术创新已不足以维持竞争优势。于是,公司开始注重品质管理,引入了先进的生产流程和严格的质量控制体系。这一举措大大提高了产品的可靠性和稳定性,赢得了客户的信赖和好评。通过持续改进和优化,AUREL公司的产品质量逐渐在行业中树立了良好的口碑。

Efficient Power Conversion公司的发展小趣事

随着EPC公司氮化镓技术的不断完善和成熟,其产品开始受到市场的广泛认可。无线电源传送、全自动汽车、高速移动通信等领域的企业纷纷采用EPC公司的氮化镓功率半导体器件,以提高其产品的性能和效率。EPC公司的市场份额逐渐扩大,成为氮化镓功率管理技术领域的领军企业。

ETTINGER公司的发展小趣事

作为英国翘楚皮具品牌,Ettinger有幸获得了H.R.H威尔士王的皇家保证。这一荣誉不仅是对Ettinger产品质量的认可,也为品牌的发展带来了更多的机遇。随着品牌知名度的提升,Ettinger逐渐成为了英国人最喜爱的皮具品牌之一,并在全球范围内拥有了广泛的粉丝群。

Diamond SA公司的发展小趣事

在电子行业竞争日益激烈的背景下,Diamond SA公司开始寻求通过并购来实现规模扩张和资源整合。他们精心挑选了一些具有潜力的目标企业,通过谈判和交易成功完成了并购。这些并购不仅为Diamond SA公司带来了更多的技术资源和市场份额,还增强了公司的整体竞争力。

Baneasa SA公司的发展小趣事

Baneasa SA公司成立之初,便专注于电子元器件的研发与生产。公司凭借创始团队的技术积累和市场洞察力,成功开发出一款高性能的半导体芯片,迅速在行业内崭露头角。这款芯片以其出色的稳定性和可靠性赢得了市场的广泛认可,为Baneasa SA的发展奠定了坚实的基础。

问答坊 | AI 解惑

控制阀的选型

1. 概述 控制阀安装在工艺过程自动控制系统中,直接控制控制工艺介质。多年以来,控制阀被认为是低技术含量产品,事实上控制阀往往要控制高温、高压、高压差、高粘度或含有固体颗粒、强腐蚀性和闪蒸的流体,工作条件非常恶劣,从而导致调节阀使用 ...…

查看全部问答>

TCRT5000_红外反射式光电传感器_反射型光电开关_光电对管_寻迹小车专用

TCRT5000_红外反射式光电传感器_反射型光电开关_光电对管_寻迹小车专用…

查看全部问答>

请高手看看这个屏

请高手看看这个屏,请告诉我型号,在下感激不尽…

查看全部问答>

问一下关于如何让板子脱机运行的问题~

最近在研究一块板子,就是用书上说的tftp、nfs之类的方法,现在把文件系统已经移到了SD卡上,但板子加电启动的时候中间还是要经过漫长的一段过程……最后再找SD卡挂载上面得fs…… Sending DHCP requests ...eth0: no IPv6 routers present ... t ...…

查看全部问答>

继续中星微301驱动开发

在网上下载了2个版本的中星微linux下的驱动,同样是HV7131b的sensor,两个版本格式却不一样。一个是: static U16 hv7131bxx_start_data[][3] = {     {0xA0, 0x01, 0x0000},     {0xA0, 0x10, 0x0002},     {0xA ...…

查看全部问答>

有谁在 vista x64 下 安装过 passthru 驱动的,来指点下

我使用微软提供的 WDK 6000 bindview 程序(超级用户权限, X64的版本)在 vista x64 下安装 passthru 驱动 发现,只有使用 pncClassSetup->SelectAndInstall 方法才能反复安装成功, pncClassSetup->Install 只能在没安装过 自己驱动的机器上安装 ...…

查看全部问答>

Cyclone 1 (EP1C12) 输出接OC门怎么设置

如题,选用的是Altera的Cyclone芯片,具体型号是EP1C12,有点搞不清楚IO输出电平,看资料好像有LVTTL,LVCMOS等形式的,我的电路输出接口要求是用OC门输出,打算加入一篇74LS06或者74LS04,但是不知道输入的电平是否匹配。 有人用过FPGA输出OC门么 ...…

查看全部问答>

招聘Windows Mobile/Win CE应用工程师

由于公司扩展,急需招聘Windows   Mobile/Win   CE应用工程师 有意者发送简历到simonjin@gotoup.cn或直接发送到hr@gotoup.cn 公司简介: 上海向上信息科技有限公司是一家专业从事智能手机研究、开发的高新技术企业。主要 ...…

查看全部问答>

wince 5/6能访问asp的商务网站么?

wince   5/6能访问asp的商务网站么?有可能么? 我想在以下的开发板上跑wince   5或6,做商务网站客户端    通过有线或无线网卡浏览asp的商务网站可行不? 硬件平台: arm   2410 sdram  &nb ...…

查看全部问答>

关于继电器

在proteus和keil中用继电器控制照明灯,keil程序和proteus电路图如下,可是就是看不到效果,请各位大虾指点一下: #include #define uchar unsigned char #define uint unsigned int sbit s1=P1^0; sbit out=P2^4; void delay(uint z) { ...…

查看全部问答>