基本接线: PA9==>传感器PIN4
PA10==>PIN5
PE6 ==>PIN3
其它就是V50接传感器VCC GND接GND
迪文串口屏只需要用到V50,GND,TX,RX,所以使用了PA2,PA3两个GPIO口
- int main(void)
- {
- SystemSetup(); // 本函数已包含SystemInit(),所以屏蔽上一行 ,使能外设时钟
- // delay_init(72); //延时初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- LED_Init(); //LED端口初始化
- EnablePMSensor();
- // DisablePMSensor();
- // delay_ms(2000);
- PmSensor_com_init(9600); //传感器串口初始化 串口1 TX=PA9 RX=PA10
- Screen_com_init(115200); //串口屏初始化 串口2 TX=PA2 RX=PA3
- // timer3_Init(9,7199); //10Khz的计数频率,计数到10为1ms
- switchPage(1);
- while (1)
- {
- display_page_n(1,pm_golob);
- // display_page_n(2,pm_golob);
- }
主函数非常熟悉吧,和ARM那套基本上一样的。 这中间有一个细节,SYSTICK的寄存器命名和ARM那套不怎么一样,需要查规格书,在9.5.5。源码里面关于结构体里面的成员是一丁点注释都没有,这个希望原厂有机会加上。
- void EnablePMSensor(void)
- {
- GPIO_SetBits(SENSOR_SET_PORT, SENSOR_SET_PIN);
- }
- void DisablePMSensor(void)
- {
- GPIO_ResetBits(SENSOR_SET_PORT, SENSOR_SET_PIN);
- }
记得使能传感器的SET脚,拉高就是唤醒,拉低会休眠。 可以用耳朵听听传感器的风扇是否转动。
传感器用的是主动模式,所以我们只需要使能接收中断即可
- //Usart1 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
-
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(USART1, &USART_InitStructure);
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
- USART_Cmd(USART1, ENABLE); //使能串口
接上传感器后,就等着中断产生,在中断处理函数里面处理好数据。
传感器是42,4D开始的,做了一个小小的标志位,也没有检查CHECKSUM, 正式写产品这些都要加上的。
- void USART1_IRQHandler(void) //串口1 传感器的中断服务程序
- {
- unsigned char data ;
- static uint8_t pm_data_start = 0;
- if(USART_GetITStatus(USART1, USART_IT_RXNE))
- {
- data =USART_ReceiveData(USART1); //读取接收到的数据
- if(data==0x42)
- {
- sensor_i=0;
- pm_data_start=1;
- }
- if(pm_data_start==1)
- {
- sensor_buffer[sensor_i++]=data;
- OPEN_LED1;
- }
- //getPmsensorData(&pm_golob);
- if(sensor_i>31)
- {
- // if(check_sum())
- // {
- getPmsensorData(&pm_golob);
- // }
- sensor_i=0;
- pm_data_start=0;
- }
- CLOSE_LED1;
- }
- }
至此,就可以在屏上显示传感器的值了。