STM32学习心得(3)
//改变占空比
TIM_SetCompare4(TIM3,
j)
管脚的IO输出模式是根据应用来定,比如如果用PWM输出驱动LED则应该将相应管脚设为AF_PP,否则单片机没有输出。
注:下面是一些常用的代码,网上很多但是大多注释不全。高手看没问题,对于我们这些新手就费劲了……所以我把这些代码集中,进行了逐句注释,希望对新手们有价值。
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、
我的理解——不理解,也不需要理解。只要知道所有外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。
基础应用1,只有一个函数debug。所有程序中必须的。
用法:
#endif
4、
我的理解——管理系统内部的中断,负责打开和关闭中断。
基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。所有程序中必须的。
用法:
{
NVIC_InitTypeDef
#ifdef
NVIC_SetVectorTable(NVIC_VectTab_RAM,
#else
NVIC_SetVectorTable(NVIC_VectTab_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_IRQChannelPreemptionPrio
//NVIC_InitStructure.NVIC_IRQChannelSubPriority
//NVIC_InitStructure.NVIC_IRQChannelCmd
//NVIC_Init(&NVIC_InitStructure);
}
5、
我的理解——管理外部、内部和外设的时钟,设置、打开和关闭这些时钟。
基础应用1:时钟的初始化函数过程——
用法:void
{
if
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//flash读取缓冲,加速
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
RCC_PCLK1Config(RCC_HCLK_Div2);
//注:AHB主要负责外部存储器时钟。PB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,
RCC_PLLCmd(ENABLE);
while
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while
//RCC_AHBPeriphClockCmd(ABP2设备1
//RCC_APB2PeriphClockCmd(ABP2设备1
}
6、
我的理解——外部设备通过引脚给出的硬件中断,也可以产生软件中断,19个上升、下降或都触发。EXTI0~EXTI15连接到管脚,EXTI线16连接到PVD(VDD监视),EXTI线17连接到RTC(闹钟),EXTI线18连接到USB(唤醒)。
基础应用1,设定外部中断初始化函数。按需求,不是必须代码。
用法:
{
EXTI_InitTypeDef
EXTI_InitStructure.EXTI_Line
EXTI_InitStructure.EXTI_Mode
EXTI_InitStructure.EXTI_Trigger
EXTI_InitStructure.EXTI_LineCmd
EXTI_Init(&EXTI_InitStructure);
}
7、
我的理解——通过DMA应用可以加速单片机外设、存储器之间的数据传输,并在传输期间不影响CPU进行其他事情。这对于入门开发基本功能来说没有太大必要,这个内容先行跳过。
8、
我的理解——可以输出和利用系统时钟的计数、状态。
基础应用1,精确计时的延时子函数。推荐使用的代码。
用法:
static
void
{
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_ITConfig(DISABLE);
SysTick_SetReload(9000);
SysTick_ITConfig(ENABLE);
}
void
{
SysTick_CounterCmd(SysTick_Counter_Enable);
while(TimingDelay
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_CounterCmd(SysTick_Counter_Clear);
}
void
{
if
{
}
}
注:建议熟练后使用,所涉及知识和设备太多,新手出错的可能性比较大。新手可用简化的延时函数代替:
void
{
}
当延时较长,又不需要精确计时的时候可以使用嵌套循环:
void
{int
{for
}
9、
我的理解——所有输入输出管脚模式设置,可以是上下拉、浮空、开漏、模拟、推挽模式,频率特性为2M,10M,50M。也可以向该管脚直接写入数据和读取数据。
基础应用1,gpio初始化函数。所有程序必须。
用法:void
{
GPIO_InitTypeDef
GPIO_InitStructure.GPIO_Pin
GPIO_InitStructure.GPIO_Speed
GPIO_InitStructure.GPIO_Mode
GPIO_Init(GPIOC,
//注:以上四行代码为一组,每组GPIO属性必须相同,默认的GPIO参数为:ALL,2MHz,FLATING。如果其中任意一行与前一组相应设置相同,那么那一行可以省略,由此推论如果前面已经将此行参数设定为默认参数(包括使用GPIO_InitTypeDef
……
}
基础应用2,向管脚写入0或1
用法:GPIO_WriteBit(GPIOB,
基础应用3,从管脚读入0或1
用法:GPIO_ReadInputDataBit(GPIOA,
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/feiniao_lql/archive/2010/06/13/5668585.aspx
0、
a)
b)
1、
a)
b)
c)
d)
void
void
void
void
e)
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
f)
属于Lib的Debug函数的调用,应该放在main函数最开始,不要改变其位置。
g)
Flash优化处理可以不做,但是两句也不难也不用改参数……
根据需要开启设备时钟可以节省电能
时钟频率需要根据实际情况设置参数
h)
注意理解占先优先级和响应优先级的分组的概念
i)
注意以后的过程中收集不同管脚应用对应的频率和模式的设置。
作为高低电平的I/O,所需设置:RCC初始化里面打开RCC_APB2
PeriphClockCmd(RCC_APB2Periph_GPIOA);GPIO里面管脚设定:IO输出(50MHz,Out_PP);IO输入(50MHz,IPU);
j)
GPIO_WriteBit(GPIOB,
GPIO_WriteBit(GPIOB,
GPIO_WriteBit(GPIOB,
GPIO_ReadInputDataBit(GPIOA,
k)
void
{for(;
实验步骤:
RCC初始化函数里添加:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1
不用其他中断,NVIC初始化函数不用改
GPIO初始化代码:
//IO输入,GPIOB的2、10、11脚输出
简单的延迟函数:
void
{
完成之后再在main.c的while里面写一段:
GPIO_WriteBit(GPIOB,
Delay(0xffff);
GPIO_WriteBit(GPIOB,
Delay(0xffff);
就可以看到连接在PB2脚上的LED闪烁了,单片机就跑起来了。
STM32笔记之八:来跟PC打个招呼,基本串口通讯
a)
b)
void
c)
void
初始化代码:
void
{
//串口参数初始化
//初始化参数设置
USART_InitStructure.USART_WordLength
USART_Init(USART1,
}
RCC中打开相应串口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1
GPIO里面设定相应串口管脚模式
//串口1的管脚初始化
GPIO_InitStructure.GPIO_Mode
GPIO_InitStructure.GPIO_Pin
GPIO_InitStructure.GPIO_Mode
评论