原创 stm32助学例程学习笔记二:例程3-13摘录总结

2011-4-22 15:35 4584 6 8 分类: MCU/ 嵌入式

        这几天以来,一直是连续地学,舍不得花时间写东西了。现在学到助学例程13了,把其中重点的东西总结一下吧。

助学例程3:stm32定时器Tim3精确定时程序(外部高速晶振为8MHz,下同)-----重点是定时

 /**********************************************************************
* 名    称:TIM3_Configuration()
* 功    能:定时器3配置
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:定时1ms
***********************************************************************/
 void TIM3_Configuration(void)
 {
  TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
 
  TIM_TimeBaseStructure.TIM_Prescaler = 1;                     //2分频 16M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数模式
  TIM_TimeBaseStructure.TIM_Period = 16000;                    //自动装载,周期为1ms
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                //使能中断源
  TIM_Cmd(TIM3, ENABLE);                      //使能外设
  }

助学例程4:stm32IO口输入程序-------重点是引脚电平读取                 

temp=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);   //读取PA2                          GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)此函数在stm32f10x_gpio.c里

助学例程6-STM32 USART1异步串口发送数据例程(查询方式)------重点是发送数据和检测结束标志

  USART_SendData(USART1,(uint8)2);                                  //发送数据
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}  ; //等待数据发送

助学例程7-USART1 串口接收程序(查询方式)-------接收数据函数的调用

  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET) // 等待接收数据
   {                  
     dat = USART_ReceiveData(USART1);
  USART_SendData(USART1,(uint8)dat);              //发送数据
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}  ; //等待数据发送
    }

助学例程8-stm32 USART2 串口发送程序(查询方式)-----同例程6                                                               助学例程9-stm32 USART1串口发送程序(中断方式)------同例程7

助学例程10-STM32 USART1 接收程序(中断方式)-------与例程7差不多,只是将while(1)里的循环体往串口中断处理程序移动了。

助学例程11- STM32 PWM实验------重要设置:自动重装载值,基波宽度,脉冲宽度。(在TIM1_Configuration)

/**********************************************************************
* 名    称:TIM1_Configuration()
* 功    能: 定时器1配置
* 接口参数:
* 全局变量:
-----------------------------------------------------------------------
* 说明:配置为PWM输出模式,输出引脚PA8,互补输出到PB13
***********************************************************************/
void  TIM1_Configuration(void)
{
  TIM1_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;
  TIM1_OCInitTypeDef        TIM1_OCInitStructure;


  TIM1_DeInit();


  TIM1_TimeBaseStructure.TIM1_Prescaler = 0x0;      //时钟预分频得CK_INT时钟提供给计数器  APB2时钟/(n+1)  n=1~65536
  TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up; //向上计数模式
  TIM1_TimeBaseStructure.TIM1_Period = 0xffff;      //自动重装载值
  TIM1_TimeBaseStructure.TIM1_ClockDivision = TIM1_CKD_DIV1;  //时钟倍频因子,输出时钟供给死区发生器等
  TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x00;    //周期计数器值 0~255
  TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);      //初始化


  TIM1_OCInitStructure.TIM1_OCMode       = TIM1_OCMode_PWM2;       //PWM2模式
  TIM1_OCInitStructure.TIM1_OutputState  = TIM1_OutputState_Enable;  //信号输出到对应的输出引脚
  TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable; //互补信号输出到对应的输出引脚                
  TIM1_OCInitStructure.TIM1_Pulse = 0;          //脉冲宽度
  TIM1_OCInitStructure.TIM1_OCPolarity   = TIM1_OCNPolarity_High;   //互补输出高电平有效
  TIM1_OCInitStructure.TIM1_OCNPolarity  = TIM1_OCNPolarity_High;    //互补输出高电平有效    
  TIM1_OCInitStructure.TIM1_OCIdleState  = TIM1_OCIdleState_Set;  //输出空闲状态为1
  TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;   //互补输出空闲状态为0      
 
  TIM1_OC1Init(&TIM1_OCInitStructure);          //OC1通道初始化


  TIM1_Cmd(ENABLE);            //使能定时器1

  TIM1_CtrlPWMOutputs(ENABLE); //使能PWM输出
}

/**********************************************************************
* 名    称:PWMSet()
* 功    能: 设置PWM基波宽度,占空比
* 接口参数:base_wide 基波宽度
            pulse_wide 脉冲宽度
* 全局变量:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void PWMSet(uint16  base_wide,uint16 pulse_wide)
{
  TIM1_SetAutoreload(base_wide);
  TIM1_SetCompare1(pulse_wide);
}                                                                                                                                                                                  while(1)                         //循环体设置占空比不停地在变化
 {
  Delay(100);       //延时
  if (dat<0xfe0) dat=dat+20;   //延时一定时间脉冲宽度+20
  else  dat=0;

  PWMSet(0xfff,dat);    //设置占空比
  }

助学例程12-STM32进入停止模式并唤醒-----停止模式的进入以及中断唤醒

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式

助学例程13-STM32 Flash模拟EEPROM 存储数据例程------重点是过程:解锁->擦除->写半字->上锁

void SavePara(uint32 addr,uint16 data)
{
  FLASH_Unlock();          //每次擦除Flash中数据时得先解锁
  FLASH_ErasePage(ADDR_BASE);      //擦除页
  FLASH_ProgramHalfWord(addr,data);//写16位半字
  FLASH_Lock();           //上锁                                                                                                                                   

}

*****************************************************************************************************/
uint16 GetPara(uint32 addr)
{
   uint16 data;
   data=(uint16)(*(uint32*)addr); //读取相应地址中的16位数据
   return data;
}                   //  读取是可以直接读出来的

        都是固件库函数的运用,在这里只是理一下思路而已,免得以后去具体例程寻找思路。易记之!

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2014-4-6 10:00

傻逼……

用户267826 2011-8-14 13:55

你好,我看到你的程序中有用到flash的存储,你所说的过程:解锁->擦除->写半字->上锁,这个我可以理解。但是在解锁之前你有没有对flash做相应的配置设定之类的操作?? 据我所知如果flash被写保护的话是不能进行擦除和编程操作的,所以你在擦除之前要不要先解除写保护?? 还有就是在你的读出函数中,你直接从地址读出来了数值,但是会不会被读出保护了呢? 我现在写一个程序,也是为了用flash存放数据以防掉电丢失,但是总是写不进去,每次调用库函数中的写入函数时就卡在那,不知道什么原因,你可否给我指点一下,,谢谢

xucun915_925777961 2011-4-29 01:00

不错,加油!
相关推荐阅读
用户408763 2014-01-06 16:05
ARM技压群雄——发挥ARM Cortex-M3和M4微控制器最大作用的要诀
引言 许多嵌入式开发人员对ARM Cortex处理器架构颇为熟悉,但很少有人能够对这种流行架构了如指掌,从而可以充分发挥它独特的特性和性能。新型ARM Cortex-M4处理器尤为如此,它拥有引以为...
用户408763 2011-10-05 11:31
MSP430系列芯片晶振选型说明
MSP430系列芯片晶振选型说明 本报告把MSP430系列芯片分为两个部分,一个是高速晶振接口,另一个是低速晶振接口,在一般的情况下,高速晶振接口所能接的晶振,低速晶振接口也能接,但是低速晶振必须...
用户408763 2011-06-20 09:57
为什么选择旁路电容很重要
  设计人员在选择旁路电容,以及电容用于滤波器、积分器、时序电路和实际电容值非常重要的其他应用时,都必须考虑这些因素。若选择不当,则可能导致电路不稳定、噪声和功耗过大、产品生命周期缩短,以及产生不可预...
用户408763 2011-04-20 16:01
示波法电子血压计的技术代际划分
示波法电子血压计的技术代际划分 作者:金亿帝科技有限公司 2008,05,25于深圳 一、电子血压计从使用的原理上分为两大类: 1.听诊法(又称柯氏音法)电子血压计,目前只有极少数 2.示波法(又称振...
用户408763 2011-04-20 15:52
欧姆龙血压计如何实现低成本设计
  当我们对欧姆龙的智能电子血压计HEM-711AC进行拆解时,我们深刻感到,个人保健正在成为不可多见的亮点应用。该血压计以极低的价格实现了一些复杂的测量,产品放在小包裹中,因而适合家庭和外出使用。H...
EE直播间
更多
我要评论
2
6
关闭 站长推荐上一条 /3 下一条