你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6695|回复: 3

芯片内部存储器flash操作函数

[复制链接]

15

主题

99

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-7-11 14:04:34 | 显示全部楼层 |阅读模式
 本文是有(STM32F105系列http://www.y-ec.com)整理转自作者:weiqing0707
 
注:下面是一些常用的代码,网上很多但是大多注释不全。高手看没问题,对于我们这些新手就费劲了……所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。
 
阅读flash:芯片内部存储器flash操作函数
 
我的理解——对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
 
基础应用1,flash时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24mhz时,取latency=0;24—48mhz时,取latency=1;48~72mhz时,取latency=2。所有程序中必须的
 
用法:flash_setlatency(flash_latency_2);
 
位置:rcc初始化子函数里面,时钟起振之后。
 
基础应用2,开启flash预读缓冲功能,加速flash的读取。所有程序中必须的
 
用法:flash_prefetchbuffercmd(flash_prefetchbuffer_enable);
 
位置:rcc初始化子函数里面,时钟起振之后。
 
3、阅读lib:调试所有外设初始化的函数。
 
我的理解——不理解,也不需要理解。只要知道所有外设在调试的时候,ewram需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。
 
基础应用1,只有一个函数debug。所有程序中必须的。
 
用法:
#ifdefdebug
 
debug();
 
#endif
 
位置:main函数开头,声明变量之后。
 
4、
阅读nvic:系统中断管理。
 
我的理解——管理系统内部的中断,负责打开和关闭中断。
 
基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。所有程序中必须的。
 
用法:
voidnvic_configuration(void)
 
{
 
nvic_inittypedef
nvic_initstructure;
//中断管理恢复默认参数
 
#ifdef
vect_tab_ram//如果c/c++
compilerpreprocessordefined
symbols中的定义了vect_tab_ram(见程序库更改内容的表格)
 
nvic_setvectortable(nvic_vecttab_ram,0x0);//则在ram调试
 
#else
//如果没有定义vect_tab_ram
 
nvic_setvectortable(nvic_vecttab_flash,0x0);//则在flash里调试
 
#endif
//结束判断语句
 
//以下为中断的开启过程,不是所有程序必须的。
 
//nvic_prioritygroupconfig(nvic_prioritygroup_2);
 
//设置nvic优先级分组,方式。
 
//注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定,nvic_prioritygroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。
 
//nvic_initstructure.nvic_irqchannel=中断通道名;//开中断,中断名称见函数库
 
//nvic_initstructure.nvic_irqchannelpreemptionpriority=0;
//抢占优先级
 
//nvic_initstructure.nvic_irqchannelsubpriority=0;
//响应优先级
 
//nvic_initstructure.nvic_irqchannelcmd=enable;//启动此通道的中断
 
//nvic_init(&nvic_initstructure);
//中断初始化
 
}
 
5、 (STM32F107系列)
阅读rcc:单片机时钟管理。
 
我的理解——管理外部、内部和外设的时钟,设置、打开和关闭这些时钟。
 
基础应用1:时钟的初始化函数过程——
 
用法:void
rcc_configuration(void)
//时钟初始化函数
 
{
 
errorstatus
hsestartupstatus;
//等待时钟的稳定
 
rcc_deinit();
//时钟管理重置
 
rcc_hseconfig(rcc_hse_on);
//打开外部晶振
 
hsestartupstatus=rcc_waitforhsestartup();
//等待外部晶振就绪
 
if(hsestartupstatus==success)
 
{
 
flash_prefetchbuffercmd(flash_prefetchbuffer_enable);
 
//flash读取缓冲,加速
 
flash_setlatency(flash_latency_2);
//flash操作的延时
 
rcc_hclkconfig(rcc_sysclk_div1);
//ahb使用系统时钟
 
rcc_pclk2config(rcc_hclk_div2);
//apb2(高速)为hclk的一半
 
rcc_pclk1config(rcc_hclk_div2);
//apb1(低速)为hclk的一半
 
//注:ahb主要负责外部存储器时钟。pb2负责ad,i/o,高级tim,串口1。apb1负责da,usb,spi,i2c,can,串口2345,普通tim。
 
rcc_pllconfig(rcc_pllsource_hse_div1,rcc_pllmul_9);//pllclk=8mhz*9=72mhrcc_pllcmd(enable);
//启动pll
 
while(rcc_getflagstatus(rcc_flag_pllrdy)==reset){}
//等待pll启动
 
rcc_sysclkconfig(rcc_sysclksource_pllclk);//将pll设置为系统时钟源
 
while(rcc_getsysclksource()!=0x08){}
//等待系统时钟源的启动
 
}
 
//rcc_ahbperiphclockcmd(abp2设备1|abp2设备2|,enable);
//启动ahp设备
 
//rcc_apb2periphclockcmd(abp2设备1|abp2设备2|,
enable);//启动abp2设备
 
//rcc_apb1periphclockcmd(abp2设备1|abp2设备2|,enable);
//启动abp1设备
 
}
 
6、阅读exti:外部设备中断函数
 
我的理解——外部设备通过引脚给出的硬件中断,也可以产生软件中断,19个上升、下降或都触发。exti0~exti15连接到管脚,exti线16连接到pvd(vdd监视),exti线17连接到rtc(闹钟),exti线18连接到usb(唤醒)。
 
基础应用1,设定外部中断初始化函数。按需求,不是必须代码。
 
用法:voidexti_configuration(void)
 
{
 
exti_inittypedef
exti_initstructure;
//外部设备中断恢复默认参数
 
exti_initstructure.exti_line=通道1|通道2;
//设定所需产生外部中断的通道,一共19个。
 
exti_initstructure.exti_mode=exti_mode_interrupt;
//产生中断
 
exti_initstructure.exti_trigger=exti_trigger_falling;
//上升下降沿都触发
 
exti_initstructure.exti_linecmd=enable;
//启动中断的接收
 
exti_init(&exti_initstructure);
//外部设备中断启动
 
}
 
7、阅读dma:通过总线而越过cpu读取外设数据
 
我的理解——通过dma应用可以加速单片机外设、存储器之间的数据传输,并在传输期间不影响cpu进行其他事情。这对于入门开发基本功能来说没有太大必要,这个内容先行跳过。
 
8、阅读systic:系统定时器
 
我的理解——可以输出和利用系统时钟的计数、状态。
 
基础应用1,精确计时的延时子函数。推荐使用的代码。
 
用法:
 
staticvu32
timingdelay;
//全局变量声明
 
void
systick_config(void)
//systick初始化函数
 
{
 
systick_countercmd(systick_counter_disable);
//停止系统定时器
 
systick_itconfig(disable);//停止systick中断
 
systick_clksourceconfig(systick_clksource_hclk_div8);
//systick使用hclk作为时钟源,频率值除以8。
 
systick_setreload(9000);
//重置时间1毫秒(以72mhz为基础计算)
 
systick_itconfig(enable);
//开启systic中断
 
}
 
voiddelay(u32ntime)
//延迟一毫秒的函数
 
{
 
systick_countercmd(systick_counter_enable);
//systic开始计时
 
timingdelay=ntime;
//计时长度赋值给递减变量
 
while(timingdelay!=0);//检测是否计时完成
 
systick_countercmd(systick_counter_disable);
//关闭计数器
 
systick_countercmd(systick_counter_clear);
//清除计数值
 
}
 
voidtimingdelay_decrement(void)
//递减变量函数,函数名由“stm32f10x_it.c”中的中断响应函数定义好了。
 
{
 
if(timingdelay!=0x00)//检测计数变量是否达到0
 
{timingdelay--;//计数变量递减
 
}
 
}
 
注:建议熟练后使用,所涉及知识和设备太多,新手出错的可能性比较大。新手可用简化的延时函数代替:
 
voiddelay(vu32ncount)
//简单延时函数
 
{
 
for(;ncount!=0;ncount--);
//循环变量递减计数
 
}
 
当延时较长,又不需要精确计时的时候可以使用嵌套循环:
 
voiddelay(vu32ncount)
//简单的长时间延时函数
 
{inti;//声明内部递减变量
 
for(;ncount!=0;ncount--)
//递减变量计数
 
{for(i=0;i=100)
//每100个systic周期喂狗
 
{
iwdg_reloadcounter();//重启计数器(喂狗)
tic_iwdg=0;
//变量清零
 
}
 
本文由(STM32F102系列http://www.y-ec.com )整理">[转]stm32整理作者:weiqing0707
<
回复

使用道具 举报

15

主题

99

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-16 15:29:28 | 显示全部楼层

RE:芯片内部存储器flash操作函数

St意法半导体http://www.y-ec.com
STM32F100系列http://www.y-ec.com/cpcp/class/
STM32F101系列http://www.y-ec.com/cpcp/class/?31.html
STM32F102系列http://www.y-ec.com/cpcp/class/?46.html
STM32F103系列http://www.y-ec.com/cpcp/class/?32.html
STM32F105系列http://www.y-ec.com/cpcp/class/?33.html
STM32F107系列http://www.y-ec.com/cpcp/class/?34.html
STM32F2系列http://www.y-ec.com/cpcp/class/?35.html
STM32F4系列http://www.y-ec.com/cpcp/class/?36.html
回复 支持 反对

使用道具 举报

15

主题

99

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-7-18 12:18:11 | 显示全部楼层

RE:芯片内部存储器flash操作函数

不能让帖子沉掉,自己顶起来
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-8-23 11:13:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版