通用函数和模块
延迟停顿函数(软件延迟)
void Delayms(uint16_t N) {
uint32_t i; for (i=0;i<(8000*N);i ); }
蜂鸣器
//PC0控制 void Beep(void) {
//GPIO_SetBits(GPIOC,GPIO_Pin_0); GPIOC->ODR|=(1<<0); Delayms(n); //GPIO_ResetBits(GPIOC,GPIO_Pin_0); GPIOC->ODR&=~(1<<0); }
简单按键电路
实验教程P76页 GPIO初始化部分:
void GPIO_KEYLED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //PD11,12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); //PC13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50Mz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//PA0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化对应端口的引脚
}
直流电机控制
#define IA(x) ((x) ? (GPIO_SetBits(GPIOE, GPIO_Pin_8)) : (GPIO_ResetBits(GPIOE, GPIO_Pin_8)))
#define IB(x) ((x) ? (GPIO_SetBits(GPIOE, GPIO_Pin_9)) : (GPIO_ResetBits(GPIOE, GPIO_Pin_9)))
双色LED发光二极管
!!!!!!
#define LEDR(x) ((x) ? (GPIO_SetBits(GPIOB, GPIO_Pin_1)) : (GPIO_ResetBits(GPIOB, GPIO_Pin_1)))
#define LEDG(x) ((x) ? (GPIO_SetBits(GPIOB, GPIO_Pin_2)) : (GPIO_ResetBits(GPIOB, GPIO_Pin_2)))
APB1和APB2
APB1: APB2:
AHB
在上面
GPIO
汇编作为函数的操作
具体背景汇编,怎么调用看
__asm LED10()
{
LDR R0,=0x4001140C
LDRH R1,[R0]
LDR R2,=0xFFFFFFFB
AND R1,R1,R2
STRH R1,[R0]
BX LR
}
__asm LED11()
{
LDR R0,=0x4001140C
LDRH R1,[R0]
LDR R2,=0x00000004
ORR R1,R1,R2
STRH R1,[R0]
BX LR
}
跑马灯++
实验例程P133 关键代码,主函数
int main(void)
{
static u8 KEY=0;
u8 i=0;
//u16 Pinx[4]={GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_7};
int P[4]={
2,3,4,7};
SystemInit(); /* 系统初始化 */
GPIO_KEYLED_Init(); /* GPIO初始化 */
while (1)
{
if ((GPIOD->IDR&(1<<11))==0) {
KEY=1;Beep();}
else{
if ((GPIOD->IDR&(1<<12))==0) {
KEY=2;Beep();}
else {
if ((GPIOC->IDR&(1<<13))==0) {
KEY=3;Beep();}
if ((GPIOA->IDR&(1<<0))==0) {
KEY=4;Beep();}}}
if(KEY==0){
//GPIO_ResetBits(GPIOD,Pinx[i]); /* LEDi+1亮 */
GPIOD->ODR&=~(1<<P[i]);
Delayms(n); /* 延时n ms */
//GPIO_SetBits(GPIOD,Pinx[i]); /* LEDi+1灭 */
GPIOD->ODR|=(1<<P[i]);
Delayms(n);
i++;
if (i>=4) i=0; }
else {
//GPIO_ResetBits(GPIOD,Pinx[KEY-1]);/* LED[KEY-1]亮 */
GPIOD->ODR&=~(1<<P[KEY-1]);
Delayms(n); /* 延时n ms */
//GPIO_SetBits(GPIOD,Pinx[KEY-1]); /* LED[KEY-1]灭 */
GPIOD->ODR|=(1<<P[KEY-1]);
Delayms(n); }
}
}
定时器组件
TIMx更新方式定时实验
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
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);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
TIMx初始化
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0 ;/*不能少!对于TIM1,TIM8高级定时器必须把重新计数器清零,否则TIM1定时器不准确,利用它可以重新不同的定时次数达到不同定时*/
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 10*1000-1; //1000ms
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 10*500-1; //500ms
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 10*200-1; //200ms
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/10000-1;//0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* 使能更新中断 */
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* 启动中断 */
TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
TIMx比较方式定时实验
TIMx初始化
u16 CCR1_Val = 10*2000; /*定时2000ms*/
u16 CCR2_Val = 10*1000; /*定时100ms*/
u16 CCR3_Val = 10*400; /*定时400ms*/
u16 CCR4_Val = 10*200; /*定时200ms*/
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period =65535;
TIM_TimeBaseStructure.TIM_Prescaler =(SystemCoreClock/10000)-1;/*预分频系数*/
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Output Compare Timing Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; /*输出定时模式*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;/*输出禁止,这里仅比较,不输出*/
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; /*比较脉冲个数*/
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
/* Output Compare Timing Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
/* Output Compare Timing Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
/* TIM Interrupts enable */
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 |TIM_IT_CC4, ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
}
中断服务函数:
void TIM3_IRQHandler(void)
{
uint16_t capture = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); /*是比较中断,清楚中断标志*/
GPIOD->ODR ^= 1<<2; /*LED1(PD2)*/
capture = TIM_GetCapture1(TIM3); /*取当前计数值*/
TIM_SetCompare1(TIM3, capture + CCR1_Val); /*写新比较值到比较寄存器*/
}
else if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
GPIOD->ODR ^= 1<<3; /*LED2(PD3)*/
capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + CCR2_Val);
}
else if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
GPIOD->ODR ^= 1<<4; /*LED3(PD4)*/
capture = TIM_GetCapture3(TIM3);
TIM_SetCompare3(TIM3, capture + CCR3_Val);
}
else if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
GPIOD->ODR ^= 1<<7; /*LED4(PD7)*/
capture = TIM_GetCapture4(TIM3);
TIM_SetCompare4(TIM3, capture + CCR4_Val);
}
}
TIM_SetCompare :
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
{
/* Check the parameters */
assert_param(IS_TIM_LIST8_PERIPH(TIMx));
/* Set the Capture Compare1 Register value */
TIMx->CCR1 = Compare1;
}
/** * @brief Sets the TIMx Capture Compare2 Register value * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral. * @param Compare2: specifies the Capture Compare2 register new value. * @retval None */
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)
{
/* Check the parameters */
assert_param(IS_TIM_LIST6_PERIPH(TIMx));
/* Set the Capture Compare2 Register value */
TIMx->CCR2 = Compare2;
}
/** * @brief Sets the TIMx Capture Compare3 Register value * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. * @param Compare3: specifies the Capture Compare3 register new value. * @retval None */
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)
{
/* Check the parameters */
assert_param(IS_TIM_LIST3_PERIPH(TIMx));
/* Set the Capture Compare3 Register value */
TIMx->CCR3 = Compare3;
}
PWM实验例程
主函数
int main(void)
{
uint16_t Pulse=7200*0.5; //占空比50% 周期7200 1ms
SystemInit();
PWM_GPIO_Init(); //PWM输出口PB8,初始化
Init_TIMER(); //定时器4初始化
Init_PWM(Pulse); //PWM的通道3初始化设置
GPIO_Configuration();
TIM2_Cap_Init(0xffff,72-1); /*以1MHZ的频率计数,初始化TIM2定时器*/
LCD_Init();
Welcome();
LED1(1);LED2(1);LED3(1);LED4(1);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_11)==0) //KEY1按下
{
Pulse+=100; //占空比+100
if(Pulse>=7200-1) Pulse=1;
TIM_SetCompare3(TIM4,Pulse); //写入定时器4的通道3的占空比值
}
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0) //KEY2按下
{
Pulse-=100; //占空比-100
if((Pulse<1)||(Pulse>7200)) Pulse=7200-1;
TIM_SetCompare3(TIM4,Pulse); //写入定时器4的通道3的占空比值
}
Delay_ms(100);
LCD_ShowNum(80,190,Pulse,8,16); /*显示总的脉冲个数*/
LCD_ShowNum(80,230,Pulse*100/7200,8,16); /*显示总的脉冲个数*/
}
}
TIM2_Cap_Init:
void TIM2_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_ICInitTypeDef TIM2_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /*使能TIM2时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/*使能GPIOA时钟*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*PA0 引脚*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*PA0 上拉输入*/ GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0); /*初始化定时器2 TIM2 */ TIM_TimeBaseStructure.TIM_Period = arr; /*设定计数器自动重装值 */ TIM_TimeBaseStructure.TIM_Prescaler =psc; /*预分频器*/ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*设置时钟分割:TDTS = Tck_tim*/ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*TIM向上计数模式*/ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM2_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM2, &TIM2_ICInitStructure); NVIC_InitStructure.NVIC_IRQChannel