导航:首页 > 软件知识 > stm32如何简化程序代码

stm32如何简化程序代码

发布时间:2022-12-18 17:53:35

Ⅰ STM32怎么缠写用户程序

1、为你的bootloader程序选择存储器地址,因为STM32的存储器FLASH存储程序代码空间为512K,需要进行划分。

2、如果需要使用JTAG在线调试,则需要配置区域:

3、为您的用户程序选择合适的存储空间:同时配置在线调试区域:

4、bootloader程序编写基本流程如下:

)检测有无需要更新的标志,用户可自定义。比如说读取flash某位置存储的字节作为标志位。

2)如需更新,则调用STM32的FLASH程序擦鞋用户代码部分。

3)将新的bin文件(即2进制文件直接烧写进去,需要将keil生成的hex文件转换为bin文件,然后存储到外扩展的flash中)写入到STM32自带的FLASH中去,记住需要与上述设置的用户代码存储区一致。

4)更新成功后再跳转至用户程序。

5、用户程序需要注意一点,需要在程序运行前重新设置中断向量表,即:NVIC_SetVectorTable()。

6、用STM32自带的烧录软件进行烧录时,需要修改项目如下:

1)打开安装后目标文件中的map文件夹,我们所用的STM32为512Kflash,所以选取STM32_High-density_512K.STmap,将其分解为两个STmap文件(此文件可用记事本 打开)

STmap文件中,扇区是以每2K为一page来显示的,所以boot区我们只需要到page7,用户区我们需要page8到最后。

修改完成后再次打开此软件会发现多出了两个flash选项,可以根据此处来选择需要存储的代码区。

然后还有一处需要修改

Ⅱ STM32 新手要怎么才能快捷的入门,有那种一边写代码一边视频教学的视频教程吗

STM32 神舟I号 开发板资料 目 录
术 语 表 8
前言必读(文档结构与快速入门) 8
第0章 入门了解篇 8
0.1 STM32嵌入式入门必看之文章(学习STM32的理由!!!!) 8
0.2 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习神舟系列) 10
0.2.1 需求定义 10
0.2.2 处理器的选择 12
0.2.3 开发成本的预测和估计 16
0.2.4 产品开发设计文档(需要包括硬件和软件两个方面) 16
0.2.5 嵌入式高手对技术的理解(含辛茹苦这么多年的精华体验) 18
第1章 神舟I号开发套件硬件结构 19
1.1. 电路原理图 19
1.2. 功能特点 19
1.3. 神舟I号开发板硬件电路分析 21
1.3.1. STM32F103RBT6处理器 21
1.3.2. LED指示灯 24
1.3.3. 普通按键与复位按键 25
1.3.4. USB接口 26
1.3.5. USB转串口接口 27
1.3.6. 供电电源 28
1.3.7. RTC实时时钟 29
1.3.8. 电位器(ADC介绍) 31
1.3.9. EEPROM存储器(IIC接口控制) 31
1.3.10. W25X16 16M SPI FLASH(LCD屏上安装) 32
1.3.11. MicroSD卡接口 33
1.3.12. JTAG调试接口 35
1.3.13. 液晶显示模块 37
1.3.14. 温度传感器 38
1.3.15. 315M无线模块 39
1.3.16. 2.4G无线模块 40
1.3.17. 液晶屏 41
1.3.18. 其他扩展接口 41
1.4. 硬件结构说明 43
1.5. 连接器说明 44
1.6. 硬件资源分配 46
1.6.1. 处理器连接外围器件管脚分配 46
1.7. STM32系列ARM最小系统设计 48
第2章 其他篇 53
2.1. 带触摸的液晶屏显示屏 53
2.2. 液晶屏底板设计说明 53
第3章 STM32神舟I号基本操作篇 53
3.1 简介 53
3.2 MDK 4.12集成开发环境的组成 53
3.3 安装MDK的流程步骤 54
3.4 工程的编辑 54
3.4.1 建立工程 54
3.4.2 建立文件 58
3.4.3 添加文件到工程 59
3.4.4 管理工程目录以及源文件 60
3.4.5 编译和连接工程 64
3.4.6 打开旧工程 66
3.5 RVMDK使用技巧 68
2.3.1. 快速定位函数/变量被定义的地方 68
2.3.2. 快速注释与快速消注释 69
2.3.3. 快速打开头文件 69
3.6 JLINK V8仿真器的安装与应用 70
3.6.1 JLINK V8仿真器简介 71
3.6.2 JLINK ARM主要特点 71
3.6.3 JLINK V8仿真器安装 71
3.6.4 JLINK V8仿真器配置(MDK KEIL环境) 73
3.6.5 JLINK V8仿真器配置(IAR 环境) 79
3.6.6 J-FLASH如何烧写固件到芯片FLASH里 83
3.6.7 JLINK Commander工具查看相关信息 87
3.6.8 JLINK V8仿真器如何自动升级 88
3.7 在MDK开发环境中JLINK V8的调试技巧 90
3.8 如何通过串口下载一个固件到神舟I号开发板 92
3.9 从零开始新建一个STM32的工程模板 95
第3章 STM32神舟I号快速入门篇 115
3.1. STM32神舟I号实验例程结构 115
3.2. 如何给神舟I号板供电 117
3.1.1. 使用USB供电 117
3.1.2. 使用USB转串口接口供电 117
3.1.3. 使用JLINK V8供电 117
3.3. 烧录固件程序的三种方法 118
3.4. 如何编译和运行光盘里的第一个程序: 119
3.10 如何用JLINK V8仿真和调试第一个程序 123
第4章 STM32神舟I号功能部件基础篇 127
4.1 通用输入/输出(GPIO) 127
4.1.1. 特性 127
4.1.2. 应用领域 127
4.1.3. 管脚描述 127
4.1.4. 功能描述 127
4.1.5. 寄存器描述 133
4.1.6. 寄存器小结 137
4.1.7. 例程01 单个LED点灯程序 137
4.1.8. 例程02 单个LED灯闪烁 139
4.1.9. 例程03 LED流水灯程序 140
4.2 中断控制器 143
4.2.1 简介 143
4.2.2 特性 143
4.2.3 关于NVIC 143
4.2.4 电平中断与脉冲中断 144
4.2.5 中断初始化与设置流程概述 144
4.2.6 寄存器描述 145
4.2.7 中断控制函数 148
4.2.8 外部中断示例 148
4.2.9 嵌套向量中断控制器(NVIC)使用示例 148
4.2.10 IRQ使用示例 148
4.2.11 软件中断使用示例 148
4.2.12 中断嵌套使用示例 148
4.2.13 这个例子说明如何设置在特定的CortexM3量表 地址以外的默认使用的功能的NVIC_SetVectorTable misc.h / .c驱动程序。 148
4.2.14 实验的意义与作用 148
4.3 KEY_LED按键与315M无线模块实验 149
4.2.1. 实验的意义与作用 149
4.2.2. 实验原理 149
4.2.3. 硬件设计 150
4.2.4. 软件设计 150
4.2.5. 下载与测试 154
4.4 USART-COM串口发送实验 155
4.3.1. 实验的意义与作用 155
4.3.2. 实验原理 155
4.3.3. 硬件设计 157
4.3.4. 软件设计 157
4.3.5. 下载与现象 159
4.5 USART-COM串口发送与接收实验 162
4.4.1. 实验的意义与作用 162
4.4.2. 实验原理 162
4.4.3. 硬件设计 162
4.4.4. 软件设计 162
4.4.5. 下载与现象 164
4.6 ADC模数转换实验 165
4.5.1 实验的意义与作用 165
4.5.2 实验原理 165
4.5.3 硬件设计 166
4.5.4 软件设计 166
4.5.5 下载与现象 168
4.7 EEPROM读写程序实验 169
4.6.1. 实验的意义与作用 169
4.6.2. 试验原理 169
4.6.3. 硬件设计 170
4.6.4. 软件设计 171
4.6.5. 下载与测试 174
4.8 SPI FLASH(W25X16)读写程序实验 175
4.7.1. SPI FLASH(W25X16)读写程序实验的意义与作用 175
4.7.2. 实验原理 175
4.7.3. 硬件设计 178
4.7.4. 软件设计 178
4.7.5. 下载与测试现象 185
4.9 实时时钟与年月日实验 186
4.8.1. 实验的意义与作用 186
4.8.2. 实验原理 186
4.8.3. 硬件设计 187
4.8.4. 软件设计 188
4.8.5. 下载与测试 194
4.10 独立看门狗实验 195
4.9.1. 实验的意义与作用 195
4.9.2. 实验原理 195
4.9.3. 硬件设计 197
4.9.4. 软件设计 197
4.9.5. 下载与测试 199
4.11 SYSTICK实验 200
4.10.1. 硬件设计 200
4.10.2. 软件设计 201
4.10.3. 下载与测试 202
4.12 TFT彩屏显示实验 203
4.11.1 实验的意义与作用 203
4.11.2 实验原理 203
4.11.3 硬件设计 205
4.11.4 软件设计 206
4.11.5 下载与现象 211
4.13 TFT触摸屏显示加触摸实验 212
4.12.1. 实验的意义与作用 212
4.12.2. 实验原理 212
4.12.3. 硬件设计 213
4.12.4. 软件设计 213
4.12.5. 下载与现象 218
4.14 DS18B20温度传感器实验 219
4.13.1. 实验的意义与作用 219
4.13.2. 试验原理 219
4.13.3. 硬件设计 220
4.13.4. 软件设计 220
4.13.5. 下载与现象 222
4.15 2.4G模块通信试验 223
4.14.1. 2.4G模块通信实验的意义与作用 223
4.14.2. 实验原理 223
4.14.3. 硬件设计 223
4.14.4. 软件设计 224
4.14.5. 下载与测试现象 230
4.16 USB遥控鼠标实验 231
4.15.1. 实验的意义与作用 231
4.15.2. 实验原理 231
4.15.3. 硬件设计 232
4.15.4. 软件设计 233
4.15.5. 下载与测试 236
4.17 MICRO SD卡实验 237
4.16.1. 实验的意义与作用 237
4.16.2. 实验原理 237
4.16.3. 硬件设计 239
4.16.4. 软件设计 240
4.16.5. 下载与测试 244
4.18 SD-USB读卡器实验 245
4.17.1. 实验的意义与作用 246
4.17.2. 试验原理 246
4.17.3. 硬件设计 246
4.17.4. 软件设计 247
4.17.5. 下载与测试 250
4.19 UCOS_UCGUI_DEMO实验 251
第5章 高级实验 252
第6章 实验现象 252

Ⅲ 谁来分享下STM32的程序框架

首先我对框架的看法:框架是为了方便我们程序员开发 减少代码量,及代码质量的工具 。框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。

也就说,程序框架更多的从代码可用性角度来定义,对于应用层,这样的概念很多,比如java开发框架,net框架等等,在单片机里面,我认为:可能更多的框架应该是面向硬件操作行为,即做好单片机基本硬件模块的操作函数,封装成一个API函数,然后再你main route里面使用这些API函数的接口,建立与外界的联系。

我一般的做法是:

1.做好基本数据结构的重定义,比如typedef一些基本数据类型,使之能够通用。。

2.做好所有端口的映射,因为单片机的管脚是很多是复用的,做好这些cross-pin,对于复用很有帮助。。

3.做好涉及部件接口的操作函数接口,比如IIC总线,做好IIC总线操作的代码,包括read,write函数;

4.做好基本的通用函数接口,比如延时功能,串口调试功能,这些功能接口尽量做到与通用匹配,比如使用delay_ms(),sprintf等等;

5.每一个接口对应一个C文件和H文件,这样组织框架很容易,而且也容易寻找不同接口包含在那些文件里面。。

其他的,就是自己的一些开发习惯了吧。。

Ⅳ stm32用一个按键控制两位数码管从00-99,代码怎么写

/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2

接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)

**************************************************************//

按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2

接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)//

#include<reg52.h>

sbit P0_0=P0^0; //个位数字

sbit P0_1=P0^1; //十位数字

void delay(int k); //Tab为数码管显示值,存入一个数组内

void key_ccan(void); //声明按键扫描函数

unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}unsigned char i,shi,ge,num,count=10; //num为被显示的数字

void main()

{

P2=Tab[0];P0_0=0;P0_1=0;//显示00

num=0; //被显示的数置0

while(1)

{

key_ccan(); //调用按键扫描程序

for(i=0;i<count;i++) //显示个位、十位count次后显示的数加1

shi=num/10; //取出十位数

ge=num%10; //取出个位数

P0_0=1;P0_1=1; //关闭显示

P2=Tab[shi]; //P2口送出十位数据显示代码

P0_0=0; //打开十位显示

delay(10); //延时

P0_0=1; //关闭显示

P2=Tab[ge]; //P2口送出个位数据显示代码

P0_1=0; //打开个位显示

delay(10); //延时

P0_1=1; //关闭个位显示

}

}

void key_ccan(void)

{

unsigned char ii;

P1=0xff;

ii=P1;

if(ii!=0xff)

{

P1=0xff;

delay(50);

ii=P1;

if(ii!=0xff)

{

switch(ii)

{

case 0xfe: num++;if(num==100) num=0; break;

case 0xfd: if(num==0) num=99;else num--;break;

default: break;

}

}

}

}

void delay(int k) //最简单的C延时程序

{ unsigned char i;

while(k--) //直至K减为0则跳出

{for(i=100;i>0;i--);}

}


5.9
网络文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
单片机_两个数码管显示00~99
/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2

接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)

**************************************************************//

按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2

接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)//

#include<reg52.h>

sbit P0_0=P0^0; //个位数字

Ⅳ STM32F,简单的点亮LED的程序

int main(void)
{
SystemInit();
/* 开启GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(1);
}

Ⅵ stm32和vs1003b程序怎么写

下面是我的VS1003b_Init代码:
void My_VS1003b_Init()
{
u16 uReadVal = 0;
My_VS1003b_GPIOConfig();

My_SPI_Init(SPI1);
SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_16); //在模块为初始化之前SCLKI = 12MHZ,SPI允许的通信速率为SCLKI/6= 2MHZ
//SDI、SCI为SCLKI/4
// My_VS1003b_ExitConfig();
My_VS1003b_HardReset();
XDCS_H;
XCS_H;
My_TimeDelay(2);
My_VS1003b_WriteSCI(MODE,0x08,0x00);//软件复位,向0号寄存器写入0x0804 SM_SDINEW为1 SM_RESET为1 SM_DIFF为1环绕声
while(My_VS1003b_GetDREQState() == LOW);

My_VS1003b_WriteSCI(CLOCKF,0x98,0x00); //设置 VS1003 的时钟:例如SCI_CLOCKF=0x9800,向3号寄存器写入0x9800
//100 11 000 0000 0000 SC_MULT 为4 SC_ADD 为3 SC_FREQ为 0
// 设置完以后XTAIL不变,SCLKI = XTAIL*SC_MULT = 36MHZ,编解码速率 SCLKI*1.5 = 48MHZ;

uReadVal = My_VS1003b_Read(CLOCKF);
uReadVal += 0 ;

// SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_8);

My_VS1003b_WriteSCI(AUDATA,0xBB,0x81); //设置 VS1003 的采样率:SPI_AUDATA=0xbb81,采样率 0xBB80 48k,0x0001立体声

uReadVal = My_VS1003b_Read(AUDATA);
uReadVal += 0 ;

My_VS1003b_WriteSCI(BASS,0x00,0x00); //SPI_BASS=0x0055,重音设置,向2号寄存器写入0x0055
//SB_AMPLITUDE=5 SB_FREQLIMIT=5 低于50Hz时进行5dB的增强
uReadVal = My_VS1003b_Read(BASS);
uReadVal += 0 ;

My_VS1003b_WriteSCI(VOL,VOL_VALUE,VOL_VALUE); //初始设置音量:SCI_VOL=0x2020 左右声道相同
// while(1)
// {
// uReadVal = My_VS1003b_Read(VOL);
// uReadVal += 0 ;
// }
// VS1003_ResetDecodeTime();
SPI_WriteByte(SPI1,0); //SDI测试
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
while(My_VS1003b_GetDREQState() == LOW);

VS1003_Sintest(5);
}

SPI初始化代码:

GPIO初始略过。。。

SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;

SPI_Cmd(pstSPIx,DISABLE);
SPI_Init(pstSPIx,&SPI_InitStruct);
SPI_Cmd(pstSPIx,ENABLE);

由于我的HCLK = 36MHZ,所以此处为16分频。。。。

这是我的100b 的 GPIO_Init代码:
void My_VS1003b_GPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStruct.GPIO_Pin = VS1003b_DREQ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOC,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = VS1003b_XDCS | VS1003b_XCS | VS1003b_RSET;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC,&GPIO_InitStruct);

}

1003b 读写模块函数:

u16 My_VS1003b_Read(u8 uAddress)
{
u16 uReturnVal = 0;

// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Read);
SPI_WriteByte(SPI1,uAddress);
uReturnVal = (SPI_ReadWriteByte(SPI1,0xff) << 8);
uReturnVal |= SPI_ReadWriteByte(SPI1,0xff);
My_VS1003b_SCIStop();
return uReturnVal;
}

void My_VS1003b_WriteSDI(u8 uAddress,u8 uVal)
{
// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SDIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_ReadWriteByte(SPI1,uVal % 0x100);
My_VS1003b_SDIStop();
My_TimeDelay(1);

}

void My_VS1003b_WriteSCI(u8 uAddress,u8 uHbyte,u8 uLbyte)
{
// while(My_VS1003b_GetXCSState() == HIGH);

My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_WriteByte(SPI1,uHbyte);
SPI_WriteByte(SPI1,uLbyte);
My_VS1003b_SCIStop();
My_TimeDelay(1);
}

Ⅶ stm32通过串口与RLM060(RFID模块)通信,代码怎么写

STM32有个程序叫stm32cubemx,非常方便,然后去花10min看个视频cubemx如何自动生成代码并发送简单字符的,比如你用UART通信,在cubemx里把uart打上勾,设置好DMA中断之类的直接生成就行了,至于如何通信,要发什么样的数据到模块,就要看模块具体怎么定义的了

Ⅷ stm32用一个按键控制两位数码管从00-99,代码怎么写

按下值加一,然后显示呗,还不简单?

Ⅸ 如何生成stm32单片机程序

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如何简化程序代码相关的资料

热点内容
怎么样开发电商产品 浏览:664
安卓怎么退后台程序 浏览:170
康佳电视程序板换多少钱 浏览:941
百消丹药业有什么产品 浏览:241
太仓网络程序销售费用是多少 浏览:456
fab如何提炼产品 浏览:86
安装工程施工技术有哪些 浏览:39
生产技术储备干部是干什么的 浏览:514
如何判断数据有趋势 浏览:32
清洗一台空调的市场价多少 浏览:596
错误设置了代理如何修复 浏览:482
理财产品净值是怎么确定的 浏览:292
网络共享的数据删除了怎么撤回 浏览:640
mysqldata数据怎么恢复 浏览:538
程序员编程序用什么语言 浏览:590
聊胜一筹产品怎么样 浏览:72
工管数据是干什么用的 浏览:737
一张图告诉你怎么才能成为代理 浏览:23
如何通过市场机制来分析经济 浏览:921
外卖产品券怎么设置 浏览:951