中航证券怎么网上开户手机开户操作手册,的账户怎么打开

stm32 通用定时器使用 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 20时,
stm32&通用定时器使用。基本定时功能和4通道PWM模式的配置函数。详见blog:http://my.oschina.net/u/2255341/blog/502513
代码片段(3)
timer.c&~&5KB&&&&
#include"timer.h"
/*********************************
时钟配置为
APB1 36MHz
APB2 72MHz
**********************************/
void tim2Config(void)//简单的使用通用定时器2。
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitS
NVIC_InitTypeDef NVIC_InitS
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//使能时钟
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseInitStructure.TIM_Prescaler = 71;
//72分频,则1us计数加1
TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
//溢出周期1000 =
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启溢出中断当计数到TIM_Period时中断
TIM_Cmd(TIM2, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
static void TIM3_GPIO_Config(void)
GPIO_InitTypeDef GPIO_InitS
/* TIM3 clock enable */
//PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
* 函数名:TIM3_Mode_Config
:配置TIM3输出的PWM信号的模式,如周期、极性、占空比
:内部调用
static void TIM3_Mode_Config(void)
TIM_TimeBaseInitTypeDef
TIM_TimeBaseS
TIM_OCInitTypeDef
TIM_OCInitS
/* PWM信号电平跳变值 */
u16 CCR1_Val = 500;
u16 CCR2_Val = 375;
u16 CCR3_Val = 250;
u16 CCR4_Val = 125;
TIM_TimeBaseStructure.TIM_Period = 999;
//当定时器从0计数到999,即为1000次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = 72;
//设置预分频:72分频,即为1MHz,1us
/* -----------------------------------------------------------------------
TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
TIM3CLK = 72 MHz, Prescaler = 0x0, TIM3 counter clock = 72 MHz
TIM3 ARR Register = 999 =& TIM3 Frequency = TIM3 counter clock/(ARR + 1)
TIM3 Frequency = 72 KHz.
TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
----------------------------------------------------------------------- */
/* Time base configuration */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR1_V
//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
//当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
//使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR2_V
//设置通道2的电平跳变值,输出另外一个占空比的PWM
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//使能通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR3_V //设置通道3的电平跳变值,输出另外一个占空比的PWM
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
//使能通道3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
TIM_OCInitStructure.TIM_Pulse = CCR4_V //设置通道4的电平跳变值,输出另外一个占空比的PWM
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
// 使能TIM3重载寄存器ARR
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
//使能定时器3
* 函数名:TIM3_PWM_Init
:TIM3 输出PWM信号初始化,只要调用这个函数
TIM3的四个通道就会有PWM信号输出
:外部调用
void TIM3_PWM_Init(void)//
TIM3_GPIO_Config();
TIM3_Mode_Config();
timer.h&~&125B&&&&
#ifndef _TIMER_H_
#define _TIMER_H_
#include "stm32f10x.h"
void tim2Config(void);
void TIM3_PWM_Init(void);
stm32f10x_it.c&~&5KB&&&&
******************************************************************************
Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c
MCD Application Team
* @version V3.5.0
08-April-2011
Main Interrupt Service Routines.
This file provides template for all exceptions handler and
peripherals interrupt service routine.
******************************************************************************
* @attention
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
* &h2&&center&& COPYRIGHT 2011 STMicroelectronics&/center&&/h2&
******************************************************************************
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "stdio.h"
/** @addtogroup STM32F10x_StdPeriph_Template
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
Cortex-M3 Processor Exceptions Handlers
/******************************************************************************/
This function handles NMI exception.
* @retval None
void NMI_Handler(void)
This function handles Hard Fault exception.
* @retval None
void HardFault_Handler(void)
/* Go to infinite loop when Hard Fault exception occurs */
This function handles Memory Manage exception.
* @retval None
void MemManage_Handler(void)
/* Go to infinite loop when Memory Manage exception occurs */
This function handles Bus Fault exception.
* @retval None
void BusFault_Handler(void)
/* Go to infinite loop when Bus Fault exception occurs */
This function handles Usage Fault exception.
* @retval None
void UsageFault_Handler(void)
/* Go to infinite loop when Usage Fault exception occurs */
This function handles SVCall exception.
* @retval None
void SVC_Handler(void)
This function handles Debug Monitor exception.
* @retval None
void DebugMon_Handler(void)
This function handles PendSVC exception.
* @retval None
void PendSV_Handler(void)
This function handles SysTick Handler.
* @retval None
uint32_t GlobalTime=0;
uint32_t getGlobalTime(void)
return GlobalT
void SysTick_Handler(void)
/******************************************************************************/
STM32F10x Peripherals Interrupt Handlers
Add here the Interrupt Handler for the used peripheral(s) (PPP), for the
available peripheral interrupt handler's name please refer to the startup */
file (startup_stm32f10x_xx.s).
/******************************************************************************/
This function handles PPP interrupt request.
* @retval None
void USART1_IRQHandler(void)
//uint8_t ReceiveD
if((USART_GetITStatus(USART1,USART_IT_RXNE)))
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
//ReceiveData=USART_ReceiveData(USART1);
//printf("%c", ReceiveData);
void TIM2_IRQHandler(void)
if( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
开源中国-程序员在线工具:
相关的代码(100)
0回/1023阅
玩嵌入式的朋友,Good!
开源从代码分享开始
kangxin1234的其它代码ARM学习《七》——关于STM32中断设置之浅见
ARM学习《七》——关于STM32中断设置之浅见
发布时间: 13:04:58
编辑:www.fx114.net
本篇文章主要介绍了"ARM学习《七》——关于STM32中断设置之浅见",主要涉及到ARM学习《七》——关于STM32中断设置之浅见方面的内容,对于ARM学习《七》——关于STM32中断设置之浅见感兴趣的同学可以参考一下。
关于中断的设置,在的文档中是找不到关于相关寄存器的说明的,我不知道为什么,是让大家摸不着门道吗?还是故装高深?我非常的不理解。我最后是在《权威指南》这本书上找到相关寄存器的,这本书很好,建议大家买来仔细阅读。
在的文档中关于中断的设置只给出了一个中断异常向量表,让人摸不着头脑,其实相关寄存器才是管理所有中断开关和中断优先级的司令部,共支持至个外部中断输入(通常外部中断写作)。具体的数值由芯片厂商在设计芯片时决定。此外,还支持一个“永垂不朽”的不可屏蔽中断()输入。的实际功能亦由芯片制造商决定。
&&&&&先说为什么共支持至个外部中断。‐在内核水平上搭载了一个异常响应系统,这个系统规定为0到256个中断异常,支持为数众多的系统异常和外部中断。其中,编号为-的对应系统异常,大于等于的则全是外部中断。除了个别异常
的优先级被定死外,其它异常的优先级都是可编程的。异常的优先级在这里我们先不说,对于所有的‐内核处理器(包括STM32)256个异常中的0~15号异常都是一样的,内核规定好的,这就是‐的特点。0~15号异常如下:
&&&&从开始的外部中断类型,是制造商做成芯片后,支持的中断源数,自然各种芯片的中断源数目常常不到个,并且优先级的位数也由芯片厂商最终决定。如表:
这240个中断的使能与除能分别使用各自的寄存器来控制——这与传统的,使用单一比特的两个状态来表达使能与除能是不同的。中可以有对使能位/除能位,每个中断拥有一对。这个对子分布在对位寄存器中(最后一对没有用完)。欲使能一个中断,你需要写到对应的位中;欲除能一个中断,你需要写到对应的位中;如果往它们中写,不会有任何效果。通过这种方式,使能/除能中断时只需把“当事位”写成,其它的位可以全部为零。再也不用像以前那样,害怕有些位被写入而破坏其对应的中断设置(写没有效果),从而实现每个中断都可以自顾地设置,而互不侵犯——只需单一的写指令,不再需要读‐改‐写。
如上所述,位和位可以有对,对应的位寄存器可以有对,因此使用数字后缀来区分这些寄存器,如,如表所示。但是在特定的芯片中,只有该芯片实现的中断,其对应的位才有意义。因此,如果你使用的芯片支持个中断,则只有才需要使用。可以按字半字字节的方式来访问。又因为前个异常已经分配给系统异常,故而中断的异常号是。
现在我们再回到的中断中来,支持个外部中断,既(窗口看门狗中断~从挂起唤醒中断),我们拿串口中断来说,如果要使能串口中断,就要找到串口终端号,查看控制寄存器资料手册中的中断向量表得知串口()的终端号为,那么我们见寄存器中的位置一就可使能中断。就这么简单
下面我们将上篇中的串口调试程序以串口中断的形式实现如下:
头文件中增加寄存器
(*((volatile unsigned long *)0xE000E104))
void stm32_UsartSetup ()&&
&RCC_APB2ENR|=0x;&//
enable clock for USART1
&RCC_APB2ENR|=0x;&//复用功能IO时钟使能
&RCC_APB2ENR|=0x;&//端口A时钟使能
&GPIO_PORTA_CRH&=~(0x00000FF0);&//
Clear PA9, PA10
&GPIO_PORTA_CRH|=0x;&//
USART1 Tx (PA9)&&alternate output push-pull
&GPIO_PORTA_CRH|=0x;&//
USART1 Rx (PA10) input floating
&USART1_BRR=0x;&&////波特率9600/20M
&USART1_CR1&=0xFFFFEFFF;&//
set Data bits
&USART1_CR2&=0xFFFFCFFF;&//
set Stop bits
&USART1_CR1&=0xFFFFFBFF;&//&&//
set Parity
&USART1_CR1|=(0xx);&&//
RX, TX enable
&USART1_CR1|=0x;&//
USART enable
&USART1_CR1|=0X;&&&//允许接收中断
&SETENA1=0x;&&&&&&&//使能UART1中断
void USART1_IRQHandler(void)&//串口中断处理程序
&&&unsigned
long flag=0;
&&&while(USART1_SR&0x)
&&&&&USART1_CR1&=0
&&&&&flag=USART1_DR&0
&&&&USART1_DR=flag&0
&while((USART1_SR)&0x80==0);&//等待发送完毕
&while((USART1_SR)&0x40==0);
&&flag=USART1_SR;
&&USART1_CR1|=0x;
int main()
&&SystemInit0();&//时钟初始化
stm32_UsartSetup
();&//串口初始化
&& 就这么简单!当然,库函数考虑的很全面,有好多地方是值得我们学习的,但先学会,弄懂了它的基本功能功能再提高也不迟……
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:博客访问: 499401
博文数量: 127
博客积分: 7070
博客等级: 少将
技术积分: 945
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
对于STM32来说软件复位有两种方式:&1)采用官方自带的软件库&&&在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数&/******************************************************************************** Function Name& : NVIC_GenerateSystemReset* Description&&& : Generates a system reset.* Input&&&&&&&&& : None* Output&&&&&&&& : None* Return&&&&&&&& : None*******************************************************************************/void NVIC_GenerateSystemReset(void){& SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;}&但是不是直接调用这个函数就OK了?&在Cortex-M3权威指南中有这么一句话&这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK 置位。&所以最好在将FAULTMASK 置位才万无一失。&同样官方stm32f10x_nvic.c 文件里也直接提供了该函数&/******************************************************************************** Function Name& : NVIC_SETFAULTMASK* Description&&& : Enables the FAULTMASK priority: Raises the execution priority to -1.* Input&&&&&&&&& : None* Output&&&&&&&& : None* Return&&&&&&&& : None*******************************************************************************/void NVIC_SETFAULTMASK(void){& __SETFAULTMASK();}&所以要系统复位 只要 调用这两个函数就OK了NVIC_SETFAULTMASK();GenerateSystemReset();&2)自己编写相应汇编代码&其实到底一样,我当初是没有看到官方的函数所以自己编的,实际你看官方函数里面其实就是调用的cortexm3_macro.s同样的代码 呵呵。&我的代码:&/******************************************************************************** Function Name& : SystemReset* Description&&& : Configures the port pin connected to the push button. GPIO_D_4* Input&&&&&&&&& : None* Output&&&&&&&& : None* Return&&&&&&&& : None*******************************************************************************/__asm void SystemReset(void){&MOV R0, #1 &&&&&&&&& //;&&MSR FAULTMASK, R0 && //;&清除FAULTMASK&禁止一切中断产生&LDR R0, =0xE000ED0C &//;&LDR R1, =0x05FA0004 &//;&&STR R1, [R0] &&&&&&& //; 系统软件复位&&&&deadloop&&& B deadloop&&&&&&& //; 死循环使程序运行不到下面的代码}&然后用的时候在C程序里直接调用该函数就行了。&SystemReset();注:现在的官方提供的库里似乎已经没有NVIC_GenerateSystemReset()这个函数了,但是原理还是可以用的。
阅读(7348) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 证券账户网上开户 的文章

 

随机推荐