您的位置 首页 技术

STM32学习心得(3)

i)简单应用:改变占空比TIM_SetCompare4(TIM3,变量);j)注意事项:管脚的IO输出模式是根据应用来定,比如如果用PWM输出驱动LED则应该将相

i)简略运用:

//改动占空比
TIM_SetCompare4(TIM3,变量);
j)留意事项:
管脚的IO输出形式是依据运用来定,比方假如用PWM输出驱动LED则应该将相应管脚设为AF_PP,不然单片机没有输出。
STM32材料一(转载)
注:下面是一些常用的代码,网上许多可是大多注释不全。高手看没问题,关于咱们这些新手就费力了……所以我把这些代码会集,进行了逐句注释,期望对新手们有价值。
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_InitTypeDefNVIC_InitStructure;//中止办理康复默许参数
#ifdefVECT_TAB_RAM//假如C/C++CompilerPreprocessorDefinedsymbols中的界说了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、rcc:单片机时钟办理。
我的了解——办理外部、内部和外设的时钟,设置、翻开和封闭这些时钟。
根底运用1:时钟的初始化函数进程——
用法:voidRCC_Configuration(void)//时钟初始化函数
{
ErrorStatusHSEStartUpStatus;//等候时钟的安稳
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=72MH
RCC_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_InitTypeDefEXTI_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,准确计时的延时子函数。引荐运用的代码。
用法:
staticvu32TimingDelay;//全局变量声明
voidSysTick_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<0xffff;i++)}//内部循环递减变量计数
}
9、gpio:I/O设置函数
我的了解——一切输入输出管脚形式设置,能够是上下拉、浮空、开漏、模仿、推挽形式,频率特性为2M,10M,50M。也能够向该管脚直接写入数据和读取数据。
根底运用1,gpio初始化函数。一切程序有必要。
用法:voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//GPIO状况康复默许参数
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_标号|GPIO_Pin_标号;//管脚方位界说,标号能够是NONE、ALL、0至15。
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;//输出速度2MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模仿输入形式
GPIO_Init(GPIOC,&GPIO_InitStructure);//C组GPIO初始化
//注:以上四行代码为一组,每组GPIO特点有必要相同,默许的GPIO参数为:ALL,2MHz,FLATING。假如其间恣意一行与前一组相应设置相同,那么那一行能够省掉,由此推论假如前面现已将此行参数设定为默许参数(包含运用GPIO_InitTypeDefGPIO_InitStructure代码),本组运用也是默许参数的话,那么也能够省掉。以下重复这个进程直到一切运用的管脚悉数被界说结束。
……
}
根底运用2,向管脚写入0或1
用法:GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//写入1
根底运用3,从管脚读入0或1
用法:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feiniao_lql/archive/2010/06/13/5668585.aspx

0、试验之前的预备

a)接通串口转接器

b)下载IO与串口的原厂程序,编译经过确保调试所需硬件正常。

1、flash,lib,nvic,rcc和GPIO,根底程序库编写

a)这几个库函数中有一些函数是关于芯片的初始化的,每个程序中必用。为保证程序质量,初学阶段要求严格遵守官方习气。留意,官方程序库例程中有个platform_config.h文件,是专门用来指定同类外设中第几号外设被运用,就是说在main.c里边一切外设序号用x替代,比方USARTx,程序会到这个头文件中去查找到底是用那些外设,初学的时分参阅例程别被这个所利诱住。

b)悉数必用代码取自库函数所带例程,并增加逐句注释。

c)习气次序——Lib(debug),RCC(包含Flash优化),NVIC,GPIO

d)必用模块初始化函数的界说:

voidRCC_Configuration(void);//界说时钟初始化函数

voidGPIO_Configuration(void);//界说管脚初始化函数

voidNVIC_Configuration(void);//界说中止办理初始化函数

voidDelay(vu32nCount);//界说推迟函数

e)Main中的初始化函数调用:

RCC_Configuration();//时钟初始化函数调用

NVIC_Configuration();//中止初始化函数调用

GPIO_Configuration();//管脚初始化函数调用

f)Lib留意事项:

归于Lib的Debug函数的调用,应该放在main函数最开端,不要改动其方位。

g)RCC留意事项:

Flash优化处理能够不做,可是两句也不难也不必改参数……

依据需求敞开设备时钟能够节约电能

时钟频率需求依据实际情况设置参数

h)NVIC留意事项

留意了解占先优先级和呼应优先级的分组的概念

i)GPIO留意事项

留意今后的进程中搜集不同管脚运用对应的频率和形式的设置。

作为凹凸电平的I/O,所需设置:RCC初始化里边翻开RCC_APB2

PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO里边管脚设定:IO输出(50MHz,Out_PP);IO输入(50MHz,IPU);

j)GPIO运用

GPIO_WriteBit(GPIOB,GPIO_Pin_2,Bit_RESET);//重置

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//写入1

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x00);//写入0

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);//读入IO

k)简略Delay函数

voidDelay(vu32nCount)//简略延时函数

{for(;nCount!=0;nCount–);}

试验过程:

RCC初始化函数里增加:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

不必其他中止,NVIC初始化函数不必改

GPIO初始化代码:

//IO输入,GPIOB的2、10、11脚输出

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//管脚号

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//输入输出形式

GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化

简略的推迟函数:

voidDelay(vu32nCount)//简略延时函数

{for(;nCount!=0;nCount–);}//循环计数延时

完结之后再在main.c的while里边写一段:

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x01);//写入1

Delay(0xffff);

GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)0x00);//写入0

Delay(0xffff);

就能够看到连接在PB2脚上的LED闪耀了,单片机就跑起来了。

STM32笔记之八:来跟PC打个招呼,根本串口通讯

a)意图:在根底试验成功的根底上,对串口的调试办法进行实践。硬件代码顺利完结之后,对日后调试需求用到的printf重界说进行调试,固定在自己的库函数中。

b)初始化函数界说:

voidUSART_Configuration(void);//界说串口初始化函数

c)初始化函数调用:

voidUART_Configuration(void);//串口初始化函数调用

初始化代码:

voidUSART_Configuration(void)//串口初始化函数

{

//串口参数初始化

USART_InitTypeDefUSART_InitStructure;//串口设置康复默许参数

//初始化参数设置

USART_InitStructure.USART_BaudRate=9600;//波特率9600

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长8位

USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位中止字节

USART_InitStructure.USART_Parity=USART_Parity_No;//无奇偶校验

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流操控

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//翻开Rx接纳和Tx发送功用

USART_Init(USART1,&USART_InitStructure);//初始化

USART_Cmd(USART1,ENABLE);//发动串口

}

RCC中翻开相应串口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

GPIO里边设定相应串口管脚形式

//串口1的管脚初始化

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管脚9

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出

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

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//管脚10

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/258978.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部