前期准備
1.cortex-M3主控模塊2個
2.火焰傳感器1個
實現現象
M3采集端模塊上的LED8S閃爍,M3主控模塊監測端每兩秒查詢一次火情,LED9亮0.5秒,滅1.5秒,當有
火情產生時監測端的LED1-LED4開始流水燈顯示,按下監測端的按鍵1(KEY1)流水燈關閉。
一、STM32CubeMX配置
1.1 LED1-LED4(PE7,PE6,PE5,PE4)、KEY1(PC13)、LED9(PB8)所在GPIO的配置
1.2 串口USART2的設置為波特率115200bps,8位數據位,1位停止位,無校驗位
1.3 PC9 引腳控制 485 通信芯片收發轉換(低電平接收,高電平發送)
1.4 時鍾樹配置,主頻72M
1.5 配置定時器的工作參數
生成代碼
三、補充代碼
3.1定義變量
/* USER CODE BEGIN PV */ // LED燈的狀態 static uint16_t ledState = 0x0000; // 着火標志,默認為0,不着火 static uint8_t flag_fire = 0; // 接受的數據存放 uint8_t rxBuf[20] = {0}; /* USER CODE END PV */
3.2監測端發送命令
/* USER CODE BEGIN 0 */ void SendCmd(void) { // 監測端查詢請求的數據格式 uint8_t cmd[8] = {0}; cmd[0] = 0x01; cmd[1] = 0x04; cmd[2] = 0x00; cmd[3] = 0x02; cmd[4] = 0x00; cmd[5] = 0x01; cmd[6] = 0x90; cmd[7] = 0x0A; // 設置PC9引腳為低電平,接受數據
HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_SET); // 發送數據 HAL_UART_Transmit(串口,內容,數據大小,延時時間) HAL_UART_Transmit(&huart2,cmd,8,0xffff); // 設置PC9引腳為低電平,接受數據 HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_RESET); // 接受數據HAL_UART_Receive_IT(串口,數據,大小) HAL_UART_Receive_IT(&huart2,rxBuf,7); } /* USER CODE END 0 */
3.3啟動定時器的中斷
/* USER CODE BEGIN 2 */ if(HAL_TIM_Base_Start_IT(&htim6) != HAL_OK) { Error_Handler(); } if(HAL_TIM_Base_Start_IT(&htim7) != HAL_OK) { Error_Handler(); } /* USER CODE END 2 */
3.4實現監測端LED9 每隔 2 秒閃爍一 次(亮 0.5 秒,滅 1.5 秒)
/* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_SET); HAL_Delay(1500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }
3.5按鍵中斷
/* USER CODE BEGIN 4 */
// 實現按鍵中的回調函數 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 判斷按鍵按下 if(GPIO_Pin & GPIO_PIN_13) { // 判斷火情 if(flag_fire == 1) { // 存在火情,將標志位置0 flag_fire = 0; // LED燈置0 ledState = 0; // 所有引腳置於低電平 HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET); } } }
3.6定時器
// 定時器回調函數 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 定時器6產生 if(htim->Instance == TIM6) { // 發生火情 if(flag_fire == 1) { // ledState=0x0000 // 0x0000H=0000 0000B // 0000 0000B>>1=0000 0000B ledState = ledState>>1; // 0x0080H=1000 0000B // 1000 0000B | 0000 0000B->1000 0000B
// LED1點亮
ledState |= 0x0080 // 0x00f8H=1111 1000B if(ledState == 0x00f8) ledState = 0; HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE,ledState,GPIO_PIN_RESET); } }
//定時器7,每2秒發送一次命令 if(htim->Instance == TIM7) { SendCmd(); } }
3.7串口接受函數
485通信協議,比如
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART2) { // 比對地址碼和功能碼 if((rxBuf[0] == 0x01) && (rxBuf[1] == 0x04)) { // 定義無符號整型變量temp uint16_t temp = 0; // rxBuf[3]為寄存器的值 // 例如:rxBuf[3]=0x00c8H=1100 1000B // 1100 1000B<<8 ->0000 0000B temp = ((uint16_t)rxBuf[3])<<8; // 0000 0000B | 1000 1011 1010 0110=0000 0000 0000 0000 temp = temp | rxBuf[4]; // 當temp>100時發出報警(flag_fire = 1) if(temp > 100) { flag_fire = 1; } } } } /* USER CODE END 4 */