突然发现自己都好久没有写博客了,继上次之后估计差不多有半年了。下午刚刚看到另外一位跟我年纪相仿,同是大三的同学在CSDN发来几百篇文章,顿时觉得惭愧不已。
等这次比赛结束后我会连续发文的,毕竟也要准备去面试的;写的博客就当是笔记吧。笔记是一种很好的习惯的,希望我能坚持下去!
//LED定义---------------------------------------------
注意LED是阳极的,所以要使灯亮的话要变为低电平
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Write(GPIOC,0x0100) //使PC8置高
GPIO_SetBits(GPIOC,LED0|LED1|LED2|LED3|LED4|LED5|LED6|LED7);//关闭所有LED灯
GPIO_ResetBits(GPIOC,LED0);//打开LED0
GPIO_SetBits(GPIOD,GPIO_Pin_2);//打开锁存器
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//关闭锁存器
#define LED0 GPIO_Pin_8
#define LED1 GPIO_Pin_9
#define LED2 GPIO_Pin_10
#define LED3 GPIO_Pin_11
#define LED4 GPIO_Pin_12
#define LED5 GPIO_Pin_13
#define LED6 GPIO_Pin_14
#define LED7 GPIO_Pin_15
#define LEDAll GPIO_Pin_All
//按键的IO,当被按下时为低电平,反之为高
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_Mode = GPIO_Mode_IPU;
#define KEY_1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY_2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
PA0->KEY_1
PA8->KEY_2
PB1->KEY_3
PB2->KEY_4
//IIC,一般用于断电存储数据,比赛的时候会提供时序图,我也是直接看时序图写的
i2c_init();
IIC_val=x24C01A_Read(0xf3);
Delay_Ms(2);
x24C01A_Write(0xf3,++IIC_val);
Delay_Ms(2);
uint8_t x24C01A_Read(unsigned char address)//在读数据之前要写地址
{
unsigned char IIC_val;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
IIC_val=I2CReceiveByte();
I2CWaitAck();
I2CStop();
return IIC_val;
}
void x24C01A_Write(unsigned char address,unsigned char iic_val)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(iic_val);
I2CWaitAck();
I2CStop();
}
//蜂鸣器,对应PB4-IO(复位按键),
当你当前板子运行程序含有蜂鸣器时,重新下载程序时记得同时按下复位键
GPIO_Mode = GPIO_Mode_Out_PP
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用IO时钟口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); //PB4重映射
//PWM配置,输出比较,输入捕获
蓝桥杯有TIM1,TIM2和TIM3,一般省赛中使用的是TIM2和TIM3
TIM2_CH2(PA1) TIM2_CH3(PA2) TIM2_CH4(PA3)
TIM3_CH1(PA6) TIM3_CH2(PA7)
1.常规的PWM,用同一个定时器,PWM输出频率相同,占空比不同
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
使能对应的IO口,否则PWM波无法输出!
TIM_CtrlPWMOutputs(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
2.输出比较->PWM波同一个定时器,PWM输出频率不同,占空比不同
CH2_Val = 1000000 / CH2_fre;
CH3_Val = 1000000 / CH3_fre;
CH2_Duty = CH2_Val * CH2_duty / 100;
CH3_Duty = CH3_Val * CH3_duty / 100;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_OCMode = TIM_OCMode_Toggle;
TIM_SetCounter(TIM2,0x0);
TIM_SetCompare2(TIM2,0x0);
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_CC3, ENABLE);
void TIMX_IRQHandler(void)//中断服务函数
{
u16 capture = 0;
static u8 channel_2_flag;
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) == 1)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
capture = TIM_GetCapture2(TIM2);
if(channel_2_flag)
{
TIM_SetCompare2(TIM2,capture+CH2_Duty);
}
else
{
TIM_SetCompare2(TIM2,capture+CH2_Val-CH2_Duty);
}
channel_2_flag ^= 1;
}
}
3.输入捕获,这个我暂时还没做好,等下一次更新吧。。。。。。