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

stm32学习资料

[复制链接]
chfde 发布时间:2014-4-15 22:30
 一、教程1
                                                           STM32学习教程
 

1        一共24个库,不可能都学,都学也没用。按照我的工作需求必须学的有16个,这16个也不是全学。主要学习来源是各种例程代码、固件函数库用户手册参考手册
具体学习方法是通读不同来源的程序,在程序中找到相关的函数库的应用,然后再阅读相关文档,有条件的实验。对于内容的选择方面,根据入门内容和未来应用,将所涉及的范围精简到最低,但是对所选择的部分的学习则力求明确。以下是我按照自己的需求对程序库函数排列的学习顺序:
a)       
绝大部分程序都要涉及到的库——flashlibnvicrcc,只学基础的跟最简单应用相关必用的部分,其他部分后期再返回头学。
b)       
各种程序通用但不必用的库——extiMDAsystic,只通读理解其作用。
c)        DEMO
板拥有的外设库——gpiousart,编写代码实验。
d)       
未来需要用到的外设的库——timtim1adci2cspi,先理解等待有条件后实验。
e)       
开发可靠性相关库——bkpiwdgwwdgpwr,参考其他例程的做法。
f)       
其他,根据兴趣来学。

STM32学前班教程之六:这些代码大家都用得到

注:下面是一些常用的代码,网上很多但是大多注释不全。高手看没问题,对于我们这些新手就费劲了……所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。
1
 阅读flash 芯片内部存储器flash操作函数
我的理解——对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
基础应用1FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=024—48MHz时,取Latency=148~72MHz时,取Latency=2。所有程序中必须的
用法:FLASH_SetLatency(FLASH_Latency_2);
位置:RCC初始化子函数里面,时钟起振之后。
基础应用2开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的
用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
位置:RCC初始化子函数里面,时钟起振之后。
3
阅读lib:调试所有外设初始化的函数。
我的理解——不理解,也不需要理解。只要知道所有外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。
基础应用1只有一个函数debug。所有程序中必须的。
用法:     #ifdef DEBUG
                  debug();
           #endif
        
位置:main函数开头,声明变量之后。
4
阅读nvic:系统中断管理。
我的理解——管理系统内部的中断,负责打开和关闭中断。
基础应用1中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。所有程序中必须的
用法: void NVIC_Configuration(void)
        {
       NVIC_InitTypeDef NVIC_InitStructure;    //
中断管理恢复默认参数
       #ifdef  VECT_TAB_RAM   //
C/C++Compiler\Preprocessor\Defined 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可以是01234,分别代表抢占优先级有124816个和响应优先级有168421。规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。
//NVIC_InitStructure.NVIC_IRQChannel =
中断通道名;  //开中断,中断名称见函数库
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
抢占优先级
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //
响应优先级
//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //
启动此通道的中断
//NVIC_Init(&NVIC_InitStructure);        //
中断初始化
}
5
阅读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_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主要负责外部存储器时钟。APB2负责ADI/O,高级TIM,串口1APB1负责DAUSBSPII2CCAN,串口2345,普通TIM

 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //PLLCLK = 8MHz * 9 = 72 MH                          //设置PLL时钟源及倍频系数

 RCC_PLLCmd(ENABLE);                  //启动PLL
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{}                                    //等待PLL启动

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //PLL设置为系统时钟源

     while (RCC_GetSYSCLKSource() != 0x08)

{}                                //PLL返回,并作为系统时钟源

}
//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个上升、下降或都触发。EXTI0EXTI15连接到管脚,EXTI线16连接到PVDVDD监视),EXTI线17连接到RTC(闹钟),EXTI线18连接到USB(唤醒)。
 
基础应用1设定外部中断初始化函数。按需求,不是必须代码。
       
用法: void EXTI_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精确计时的延时子函数。推荐使用的代码。

用法:
static vu32 TimingDelay;                       //
全局变量声明
void SysTick_ Configuration (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中断
}
void Delay (u32 nTime)                           //
延迟一毫秒的函数
{
    SysTick_CounterCmd(SysTick_Counter_Enable);  //systic
开始计时

TimingDelay = nTime;                      //计时长度赋值给递减变量

while(TimingDelay != 0);                    //检测是否计时完成
    SysTick_CounterCmd(SysTick_Counter_Disable);    //
关闭计数器
    SysTick_CounterCmd(SysTick_Counter_Clear);      //
清除计数值
}
void TimingDelay_Decrement(void)  //
递减变量函数,函数名由“stm32f10x_it.c”中的中断响应函数定义好了。
{
    if (TimingDelay != 0x00)                 //
检测计数变量是否达到0

{ TimingDelay--;                                //计数变量递减
     }
}
注:建议熟练后使用,所涉及知识和设备太多,新手出错的可能性比较大。新手可用简化的延时函数代替:
void Delay(vu32 nCount)                          //
简单延时函数
{
  for(; nCount != 0; nCount--);                 //
循环变量递减计数
}
当延时较长,又不需要精确计时的时候可以使用嵌套循环:
void Delay(vu32 nCount)                         //
简单的长时间延时函数
{int i;                                          //
声明内部递减变量


 for(; nCount != 0; nCount--)                 //递减变量计数<span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:10.5pt;line-height:150%;font-family:宋体;mso-bidi-font-family:宋体;mso-font-kerning:0pt">
{for (i=0; i
收藏 评论0 发布时间:2014-4-15 22:30

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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