【Io开发笔记】机智云智能浇花器实战(1)-基础Demo实现
时间:2023-04-07 11:07:00
- #include "led.h"
- #include "systick.h"
- void LED_Init(void)
- {
- RCC_APB2PeriphClockCmd(LED1_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(LED2_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(LED3_CLK, ENABLE);
- GPIO_InitTypeDef LED_InitStruct = {0};
- LED_InitStruct.GPIO_Pin = LED1_PIN;
- LED_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- LED_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(LED1_PORT, &LED_InitStruct);
- LED_InitStruct.GPIO_Pin = LED2_PIN;
- GPIO_Init(LED2_PORT, &LED_InitStruct);
- LED_InitStruct.GPIO_Pin = LED3_PIN;
- GPIO_Init(LED3_PORT, &LED_InitStruct);
- LED1(0);
- LED2(0);
- LED3(0);
- }
- void LED_Task(void)
- {
- static uint32_t Timer = 0;
- static uint8_t Sta = 0;
- if(SoftTimer(Timer,500))
- {
- Timer=GetSoftTimer();
- Sta?(Sta=0):(Sta=1);
- LED1(Sta);
- LED2(Sta);
- LED3(Sta);
- }
- }
- void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- {
- uint32_t ODR;
- ODR = GPIOx->ODR;
- GPIOx->BSRR = ((ODR & GPIO_Pin) << 16U) | (~ODR & GPIO_Pin);
- }
- #ifndef __LED_H_
- #define __LED_H_
- #include "STM32f10x.h"
- //PB9 --- LED1 --- 低有效
- //PB8 --- LED2 --- 低有效
- //PA3 --- LED3 --- 低有效
- //基于STM32标准库 芯片是 STM32F103C8T6
- #define LED1_CLK RCC_APB2Periph_GPIOB
- #define LED1_PORT GPIOB
- #define LED1_PIN GPIO_Pin_9
- #define LED2_CLK RCC_APB2Periph_GPIOB
- #define LED2_PORT GPIOB
- #define LED2_PIN GPIO_Pin_8
- #define LED3_CLK RCC_APB2Periph_GPIOA
- #define LED3_PORT GPIOA
- #define LED3_PIN GPIO_Pin_3
- //宏定义的一个开关
- #define LED1(X) X?(GPIO_ResetBits(LED1_PORT,LED1_PIN)):(GPIO_SetBits(LED1_PORT,LED1_PIN))
- #define LED2(X) X?(GPIO_ResetBits(LED2_PORT,LED2_PIN)):(GPIO_SetBits(LED2_PORT,LED2_PIN))
- #define LED3(X) X?(GPIO_ResetBits(LED3_PORT,LED3_PIN)):(GPIO_SetBits(LED3_PORT,LED3_PIN))
- void LED_Init(void);
- void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- void LED_Task(void);
- #endif
- #include "key.h"
- #include "systick.h"
- void KEY_Init(void)
- {
- RCC_APB2PeriphClockCmd(KEY0_CLK,ENABLE);
- RCC_APB2PeriphClockCmd(KEY1_CLK,ENABLE);
- RCC_APB2PeriphClockCmd(KEY2_CLK,ENABLE);
- GPIO_InitTypeDef KEY_InitStruct;
- KEY_InitStruct.GPIO_Pin = KEY0_PIN|KEY1_PIN|KEY2_PIN;
- KEY_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
- KEY_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(KEY0_PORT ,&KEY_InitStruct);
- GPIO_Init(KEY1_PORT ,&KEY_InitStruct);
- GPIO_Init(KEY2_PORT ,&KEY_InitStruct);
- }
- static uint8_t Key0Value=0;
- static uint8_t Key1Value=0;
- static uint8_t Key2Value=0;
- void KeyScan(void)
- {
- static uint16_t Key0Timer=0;
- static uint16_t Key1Timer=0;
- static uint16_t Key2Timer=0;
- if(KEY0==0)
- {
- if(Key0Timer<10)
- {
- Key0Timer++;
- if(Key0Timer>=10)
- Key0Value=1;
- }
- }
- else
- {
- Key0Timer = 0;
- }
- if(KEY1==0)
- {
- if(Key1Timer<10)
- {
- Key1Timer++;
- if(Key1Timer>=10)
- Key1Value=1;
- }
- }
- else
- {
- Key1Timer = 0;
- }
- if(KEY2==0)
- {
- if(Key2Timer<10)
- {
- Key2Timer++;
- if(Key2Timer>=10)
- Key2Value=1;
- }
- }
- else
- {
- Key2Timer = 0;
- }
- }
- uint8_t GetKey0(void)
- {
- uint8_t Key=Key0Value;
- Key0Value=0;
- return Key;
- }
- uint8_t GetKey1(void)
- {
- uint8_t Key=Key1Value;
- Key1Value=0;
- return Key;
- }
- uint8_t GetKey2(void)
- {
- uint8_t Key=Key2Value;
- Key2Value=0;
- return Key;
- }
- #ifndef __KEY_H_
- #define __KEY_H_
- #include "stm32f10x.h"
- #define KEY0_CLK RCC_APB2Periph_GPIOA
- #define KEY0_PORT GPIOA
- #define KEY0_PIN GPIO_Pin_0
- #define KEY1_CLK RCC_APB2Periph_GPIOA
- #define KEY1_PORT GPIOA
- #define KEY1_PIN GPIO_Pin_1
- #define KEY2_CLK RCC_APB2Periph_GPIOA
- #define KEY2_PORT GPIOA
- #define KEY2_PIN GPIO_Pin_2
- #define KEY0 GPIO_ReadInputDataBit(KEY0_PORT,KEY0_PIN)
- #define KEY1 GPIO_ReadInputDataBit(KEY1_PORT,KEY1_PIN)
- #define KEY2 GPIO_ReadInputDataBit(KEY2_PORT,KEY2_PIN)
- void KEY_Init(void);
- void KeyScan(void);
- uint8_t GetKey0(void);
- uint8_t GetKey1(void);
- uint8_t GetKey2(void);
- #endif
- #include "main.h"
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- USART1_Init(9600);
- //printf("打印串口初始化 OK !\r\n");
- SysTick_Init();
- //printf("系统嘀嗒初始化 OK !\r\n");
- LED_Init();
- //printf("状态指示初始化 OK !\r\n");
- KEY_Init();
- //printf("按键配置初始化 OK !\r\n");
- while(1)
- {
- LED_Task();
- if(GetKey0())
- {
- GPIO_TogglePin(LED1_PORT,LED1_PIN);
- //JiaoHua(1-currentDataPoint.valueRelay_1);
- }
- if(GetKey1())
- {
- GPIO_TogglePin(LED2_PORT,LED2_PIN);
- //gizwitsSetMode(WIFI_AIRLINK_MODE);
- //按键进入配网模式
- }
- if(GetKey2())
- {
- GPIO_TogglePin(LED3_PORT,LED3_PIN);
- }
- }
- }
- #include "usart1.h"
- #include
- void USART1_NVIC_Config(void)
- {
- //接收中断使能
- NVIC_InitTypeDef NVIC_InitStruct;
- /*NVIC控制器配置*/
- NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//具体中断源名字
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//NVIC响应通道使能
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级值
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//响应优先级别值
- NVIC_Init(&NVIC_InitStruct);
- }
- /*打印调试串口*/
- void USART1_Init(uint32_t BaudRate)
- {
- USART_DeInit(USART1);
- //1.打开GPIO的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- //2.配置相关结构体
- GPIO_InitTypeDef GPIO_InitStruct;
- //串口发送引脚的配置 PA9->复用推挽输出
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStruct);
- //串口接收引脚的配置 PA10->浮空输入模式
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStruct);
- //1.打开串口的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//注意APB2
- USART_InitTypeDef USART1_InitStruct;
- //串口的参数配置 波特率可以更改
- //无硬件流控制 收发模式
- //1起始位 8数据位 无奇偶校验 1位停止位
- USART1_InitStruct.USART_BaudRate = BaudRate;
- USART1_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART1_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
- USART1_InitStruct.USART_Parity = USART_Parity_No;
- USART1_InitStruct.USART_StopBits = USART_StopBits_1;
- USART1_InitStruct.USART_WordLength = USART_WordLength_8b;
- //串口1初始化
- USART_Init(USART1,&USART1_InitStruct);
- /*******************/
- //开串口中断
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收中断
- //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断
- //中断优先级配置
- USART1_NVIC_Config();
- USART_Cmd(USART1,ENABLE);
- }