蓝桥杯嵌入式通用个人笔记1(必记)

突然发现自己都好久没有写博客了,继上次之后估计差不多有半年了。下午刚刚看到另外一位跟我年纪相仿,同是大三的同学在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.输入捕获,这个我暂时还没做好,等下一次更新吧。。。。。。

你可能感兴趣的:(个人学习,蓝桥杯嵌入式,笔记)