历史上的今天
返回首页

历史上的今天

今天是:2024年09月27日(星期五)

正在发生

2019年09月27日 | STM32学习之旅③ 从点灯到代码移植

2019-09-27 来源:eefocus

一、认识其本质

为什么很多单片机教程第一课都是用单片机点一个灯?就和软件编程的第一个程序都是Hello World!一样,很多人也说不上为什么,可能是历史原因,有人这样做了,别人看到了也去模仿然后也成功了。但是在我看来,成功点亮一个灯不仅仅意味着点亮了一个灯,其实已经离学会使用不远了,这个灯的点亮其实背后对应着开发环境的配置、程序文件的配置以及源文件的编译、链接到可执行文件的一步步生成完成了。但是学会使用仅仅指会操作STM32对应的的外设,更多的还是取决于嵌入式软件设计的水平。

二、所需材料

上一节中建立好的工程模板,固件库的使用及工程模板的建立


nokia5110及其驱动代码


ST-Link仿真器,十几块钱盗版的就能用,谁还去买正版的。(贫穷确实可以限制人的想象)


当然没有ST-Link仿真器的话用USB转TTL串口也是可以的,需要使用下载工具 ,密码:jcna


三、添加文件

在main.c文件中添加如下代码

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "nokia5110.h"

int main()

{

    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); //开 GPIOA 时钟

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;             //选择要初始化的引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //GPIO的工作状态为推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // GPIO的速率最高输出速率 50Hz

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

    while(1)

    {         

        GPIO_SetBits(GPIOC, GPIO_Pin_13);  //将 GPIO的A端口第二个管脚置为高电平,即PA.1=1;

        delay_us(0x8ffff);

        GPIO_ResetBits(GPIOC, GPIO_Pin_13);//将 GPIO的 A端口第二个管脚置为低电平,即PA.1=0;

        delay_us(0x8ffff);

    }

}


四、程序下载

(一)用ST-Link下载

插上ST-Link,装上对应的驱动,然后在IAR中进行对应的设置,Option->Debugger->Setup->Driver->ST-Link->Download->勾选Use flash loader(s)和Override default .board file


在ST-Link中勾选SWD,然后OK 

 这里写图片描述 
这里写图片描述 
这里写图片描述

Make,编译无误后点Download and Debugger->go 

可以看到灯亮了


问题分析:


Make编译不过,检查头文件是否包含,主要以编译器的输出信息为准

无法下载,检查驱动是否安装,检查Option中设置是否正确

(二)用串口下载

串口下载程序又称ISP调试,只支持下载不支持在线调试

在Option中设置使编译之后生成.hex文件 

这里写图片描述

如图,点OK然后Make,就可以在对应文件夹中找到对应的.hex文件 

这里写图片描述

打开Flash Loader Dome,然后将boot0置1,boot1置0,选择对应的文件,下载就行了


五、文件移植

能够点亮一个灯后,说明编译环境没问题,对GPIO的设置也没问题,可以开始代码的移植了,我用nokia5110作为显示器,用GPIO模拟spi时序来写lcd显示器,自己写了个printf函数,主要通过简单的c语言逻辑实现。比较可惜的是之前写的缓冲区是基于msp430f5529的硬件的,移植起来比较麻烦,所以用了模拟spi,不过stm32的72MHz主频果然不是盖的,用GPIO 模拟spi居然看不出任何延迟,十块钱不到的东西这么好用,怪不得那么多人玩stm32。废话不多说,开始移植


将gitub上clone的.c和.h文件添加到工程中 

这里写图片描述
这里写图片描述

然后将.c文件在IAR中添加到工程中,Add->Add File…->选择.c文件


这里写图片描述

在main.c文件中添加如下代码

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "nokia5110.h"

int main()

{

    LCD_Init();

    unsigned long d = 33;

    while(1)

    {   

        d++;

        printf("nn Hello World!nn     %dn",&d);

        GPIO_SetBits(GPIOC, GPIO_Pin_13);//将 GPIO的A端口第二个管脚置为高电平,即PA.1=1;

        delay_us(0x8ffff);

        GPIO_ResetBits(GPIOC, GPIO_Pin_13);//将 GPIO的 A端口第二个管脚置为低电平,即PA.1=0;

        delay_us(0x8ffff);

    }

}


这是自己写的printf的算法

void printf (unsigned char *String, volatile unsigned long *Adress)

{

    static int DISPBUFF[84];

    static unsigned long Num;

    Num = *Adress;

    memset (DISPBUFF, 0, sizeof(DISPBUFF));

    unsigned char X_Disp, Y_Disp;

    X_Disp = 0;

    Y_Disp = 0;

    unsigned char i;

    static unsigned char X_Set;

    X_Set = 0;

    while (*String)

    {

        if (*String == '%')

        {

            String++;

            switch(*String)

            {

                case 'd':

                {

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

                    {

                        DISPBUFF[X_Set+ByteLengh-i-1] = Num%10 + 48;

                        Num = Num/10;

                    }

                    for (i = 0; i < ByteLengh - 1; i++)

                    {

                        if (DISPBUFF[X_Set+i] == 48)

                            DISPBUFF[X_Set+i] = 32;

                        else

                            break;

                    }

                    X_Set += ByteLengh;

                    String++;

                    break;

                }

                /*

                case 'f':

                {

                    float valflt = va_arg(ap,double);

                    printfloat(valflt);

                    String++;

                    break;

                } */

                default:

                {

                    String--;

                    DISPBUFF[X_Set] = '%';

                    String++;

                }

            }

        }

        else if(*String == 'n')

        {

            DISPBUFF[X_Set] = 'n';

            X_Set++;

            String++;

        }

        else

        {

            DISPBUFF[X_Set] = *String;

            X_Set++;

            String++;

        }

    }

    LCD_Set_XY (X_Disp, Y_Disp);


    unsigned char Line_Num;

    Line_Num = 0;

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

    {

        if (DISPBUFF[i] == 'n')

        {

            Line_Num++;

            LCD_Set_XY(0, Y_Disp+Line_Num);

        }

        else

            LCD_Write_Char (DISPBUFF[i]);

    }

    //UCA0IFG |=UCTXIFG;

}


Make->下载,把线接上,可以看到nokia5110上的显示 

这里写图片描述

感觉方向不对,再来一个

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "nokia5110.h"

int main()

{

    LCD_Init();

    unsigned long d = 33;

    while(1)

    {   

        d++;

        printf("nn  Good Luck!nn",&d);

        GPIO_SetBits(GPIOC, GPIO_Pin_13);//将 GPIO的A端口第二个管脚置为高电平,即PA.1=1;

        delay_us(0x8ffff);

        GPIO_ResetBits(GPIOC, GPIO_Pin_13);//将 GPIO的 A端口第二个管脚置为低电平,即PA.1=0;

        delay_us(0x8ffff);

    }

}

这里写图片描述

如lcd所示,


Good Luck!

推荐阅读

史海拾趣

Dau Semiconductor Inc公司的发展小趣事

在成立初期,Dau Semiconductor Inc公司面临着诸多技术挑战。其中,如何实现芯片的低功耗设计是困扰公司发展的一个难题。为了解决这个问题,公司投入大量研发资源,不断探索新的技术和材料。经过数年的努力,公司终于成功突破了技术瓶颈,研发出了一款具有超低功耗的半导体芯片。这款芯片的推出,不仅为公司赢得了市场认可,也为公司在行业中树立了技术领先的形象。

BCD Semi(Diodes)公司的发展小趣事

BCD Semi(Diodes)公司自成立以来,一直致力于模拟半导体产品的设计和制造。在某一时期,公司研发团队成功突破了某项关键技术,开发出了具有更高性能、更低功耗的新型模拟器件。这一技术突破使得BCD Semi的产品在市场上更具竞争力,赢得了众多客户的青睐。随着产品升级的不断推进,公司逐渐在模拟半导体领域树立了良好的口碑。

EDAL公司的发展小趣事

随着技术的不断进步和市场的变化,EDAL公司意识到必须不断优化产品以满足客户的需求。公司投入大量研发资源,对EDA工具进行迭代升级,推出了更加智能化、用户友好的产品。同时,EDAL公司积极拓展市场,与全球各大芯片设计公司建立了合作关系,将产品销售到世界各地。

Harris公司的发展小趣事

Hammond公司的故事始于1916年,当时它仅仅是一个位于加拿大安大略省圭尔夫的后院车间。1917年,OS Hammond and Son正式成立,并在接下来的几年里开始制造电子管收音机、电池充电器等电子产品。这一时期,Hammond逐步积累了技术和市场经验,为后续的快速发展奠定了基础。随着广播和通讯行业的兴起,Hammond敏锐地捕捉到了市场机遇,开始专注于为这些行业提供关键组件。

Datalogic公司的发展小趣事

2005年,Datalogic收购了美国PSC公司,这一收购对公司在电子行业中的发展具有重要意义。PSC公司是一家在自动识别领域有着丰富经验和技术积累的企业,其产品线与Datalogic高度互补。通过整合PSC公司的技术和资源,Datalogic进一步巩固了其在电子行业中的领先地位。

CANDD公司的发展小趣事

随着市场竞争的加剧,CANDD公司意识到单打独斗已经无法满足市场的需求。于是,公司开始积极寻求与其他企业的合作机会。通过与知名电子品牌商的合作,CANDD公司成功将其技术应用于更广泛的产品领域,进一步扩大了市场份额。同时,公司还与其他技术提供商建立了战略联盟,共同研发新技术,实现了互利共赢。

问答坊 | AI 解惑

【瑞萨 CPK-RA2L1 开发板】测评 - 2:RT-Thread

本帖最后由 MianQi 于 2022-11-19 17:19 编辑 回到 RT-Thread,安装 BSP 时下载遇到问题: 解决的办法是,下载压缩文件,单独安装:   新建项目时有提醒,路径中不能有空格: …

查看全部问答>

ADS7822U驱动例程 fpga Verilog

https://download.csdn.net/download/cjfwindy/14927859 …

查看全部问答>

e络盟限时福利|《e选》-------晒单

看到EEWORLD和e络盟办的活动,买了几个物料。一共两颗IC,两个DDR4的连接器,今天刚收到快递,晒出来分享下 开箱 第一颗IC是FTDI的FT601Q-B-T,QFN-76封装 FT60x是FTDI第一代SuperSpeed USB3.0系列芯片,提供高达5Gbps的带宽 ...…

查看全部问答>

【行空板 Python编程学习主控板评测二】Mind+图形化编程——数字时钟

【行空板 Python编程学习主控板评测二】Mind+图形化编程——数字时钟   一、Mind+简介 Mind+是一款拥有自主知识产权的国产青少年编程软件,集成各种主流主控板及上百种开源硬件,支持人工智能(AI)与物联网(IoT)功能, ...…

查看全部问答>

二代奥迪夜视电脑拆解

        这次要拆的是AutoLiv(奥托拉夫,一家非常有名的汽车安全系统解决方案提供商)为奥迪生产的二代夜视系统的电脑模块,配合他家的夜视(热成像)摄像头使用。它可以侦测出车前的行人,通过仪表盘上的显 ...…

查看全部问答>

RT1052(2)工具生成代码

RT1052 ~2~工具生成代码   图1:MCU Xpreesso config tool   图2选芯片型号   图3找外设引脚 买的是野火的RT1052 EVK PRO   找个表格直接就可以   图6;配置引脚 找到这两个脚配 ...…

查看全部问答>

【行空板 Python编程学习主控板】 四、所见所得的Mind+图形化WS2812灯带实现

一、硬件及连接 双十一之前在老五家上了一次车,屯了几十根ws2812小灯带,刚好拿来用行空板测评 行空板提供了很多接口,点亮灯珠的的管家用P24来实现  由于灯带的接口大多是2.54,而行空板的接口是2.0,因此借用P23接口的正极(中间 ...…

查看全部问答>

村田制作所器件仿真软件推荐

                     村田制作所器件仿真软件推荐 https://ds.murata.co.jp/simsurfing/index.html?lcid=zh-cn 随便器件进入 ,点击仿真进入: https://ds.murata.co.jp/nfstp/? ...…

查看全部问答>

用apollo搭建MQTT服务器时出错

见图片 请问高手,什么原因?谢谢! …

查看全部问答>

经常看见别人用大电容做电焊机,为什么不会爆呢?

经常看见别人用大电容,或者18650电池,直接接2根线,没做任何保护,然后就做电焊机,我一直在想为什么不会爆呢?不是短路了吗? …

查看全部问答>