//ADC配置及换算
PB0对应ADC1,PB0引脚可复用成ADC_IN8
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能时钟信号
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//IO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure);
。。。。。//ADC配置
ADC_Cmd(ADC1, ENABLE);// 先复位校正,再开启校正。
//有一点是需要注意的,我们在对ADC校准的前,
//必须把ADC使能ADC_Cmd(ADC1, ENABLE);
//否则将卡在校准处程序卡死。
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
u16 Get_ADC(void)
{
u16 temp;
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//通过程序软件启动AD转换
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==0);
temp = ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
return temp;
}
ADC_Value=Get_ADC()*3.3/4096;//stm32f103rbt6的ADC是精度是12位了(也就是0~4096),
因此我们读出来的AD值数据是12位的,
用通俗的话来讲就是把3.3V分成4096份。
sprintf((char *)adc_string,“GET ADC_Value:%.2fV”,ADC_Value);
LCD_DisplayStringLine(Line4,adc_string);
//实时时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);
RTC_SetPrescaler(39999);
RTC_WaitForLastTask();
RTC_SetCounter(233600+5560+50);
RTC_WaitForLastTask();
void RTC_IRQHandler(void)//RTC中断
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_ClearITPendingBit(RTC_IT_SEC);
TimeDisplay = 1;
RTC_WaitForLastTask();
}
}
void Time_Display(uint32_t TimeVar)//RTC显示时间
{
uint32_t THH = 0, TMM = 0, TSS = 0;
if (RTC_GetCounter() == 0x0001517F)
{
RTC_SetCounter(0x0);
RTC_WaitForLastTask();
}
THH = TimeVar / 3600;
TMM = (TimeVar % 3600) / 60;
TSS = (TimeVar % 3600) % 60;
sprintf((char *)string2,“Time: %0.2d:%0.2d:%0.2d”, THH, TMM, TSS);
LCD_DisplayStringLine(Line9,string2);
}
while(1)
{
if(TimeDisplay == 1)
{
Time_Display(RTC_GetCounter());
TimeDisplay = 0;
}
}
//串口通信
一个是串口1(PA9,PA10),一个是串口2(PA2,PA3),
PA2->TX为发送端,PA3->RX为接收端。
不过,我们的蓝桥杯嵌入式开发板并不能直接使用串口1,
虽然确实有串口1的电路,但是它连接的确实RS232的9针串口上,
也就是说,我们不能直接通过USB去使用到这串口,
因此我们一般都用不了这个串口。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA2->TX为发送端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3->RX为接收端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
void USART_SendString(uint8_t *str)//串口发送数据
{
uint8_t index = 0;
do
{
USART_SendData(USART2, str[index]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
index++;
}while(str[index] != 0);
}
void USART2_IRQHandler(void)//中断,串口接收数据
{
uint8_t temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//这里可以不用清除串口中断
temp = USART_ReceiveData(USART2);
if((temp == ‘x’) || (RXCUNT == 20)){
RXCUNT = 0;
RXOVER = 1; //串口接收完成标志位
}
else{
USART_RXBUF[RXCUNT] = temp;
++RXCUNT;
}
警告:这里不要用USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
然后再ENABLE!本人亲测过,如果这样做的后果是当你串口接收第二次中断
(也有可能是第一次)中断后,程序会一直卡在串口的中断函数里面跳不出去!
PS:然后我将上面这两行代码注销掉后,下载进去;又取消注销,竟然可以了!
有毒!
}
}
//中断
//定时器
这两个的话应该不用说了吧;毕竟上面的内容都涉及到了它们~