项目文件夹框架

  • API文件夹---------------------------------------放置各种传感器驱动代码文件夹
  • CMSIS文件夹----------------------------------放置内核支持文件文件夹
  • JIZHIYUN文件夹------------------------------放置机智云平台对接文件文件夹
  • PROJECT文件夹------------------------------放置工程目录文件夹
  • STARTUP文件夹------------------------------放置启动代码文件夹
  • STM32F10x_StdPeriph_Driver文件夹—放置标准库函数文件夹
  • USER文件夹-----------------------------------放置工程必备一些文件的文件夹

核心板原理图

LED灯的驱动代码编写

原理图

代码实现

#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);}}
}

其他辅助代码

串口打印实现

在开发板上用的是USB TO TTL 工具 串口1 打印 实际的项目板上没有设计该电路(失误1)

串口1 驱动代码

#include "usart1.h"
#include <stdio.h>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);//注意APB2USART_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);
}/*串口重定向函数 目的是让STM32支持printf("%d %x %c ")*/
int fputc(int ch , FILE *stream)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,(uint16_t) ch); //数据通过串口发送while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);return ch;
}
#ifndef __USART1_H_
#define __USART1_H_#include "stm32f10x.h"void USART1_Init(uint32_t BaudRate);#endif

系统嘀嗒定时器代码

#include "systick.h"
#include "key.h"uint32_t mySysTick_Config(uint32_t ticks)
{ if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk   | SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */return (0);                                                  /* Function successful */
}void SysTick_Init(void)
{//SystemInit();SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);mySysTick_Config(SystemCoreClock/1000);
}
void SysTick_Handler(void)
{SystemTick();KeyScan();
}
static uint32_t Ticks=0;
void SystemTick(void)
{Ticks++;
}
uint32_t GetSoftTimer(void)
{return Ticks;
}
uint8_t SoftTimer(uint32_t BaseTimer,uint32_t Timeout)
{if(Ticks>=BaseTimer)return (Ticks)>=Timeout+BaseTimer;return (Ticks+0xFFFFFF)>=Timeout+BaseTimer;
}

初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现相关推荐

  1. 初出茅庐的小李第113篇博客项目笔记之机智云智能浇花器实战(2)-基础Demo实现

    初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现 接(1) 继电器实现 继电器原理图 继电器采用的是5V继电器,控制端是RELAY-1 继电器代码实现 #includ ...

  2. 初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现

    机智云智能浇花器实战(3)-基础Demo实现 链接:机智云智能浇花器实战(2)-基础Demo实现 BH1750光照传感器原理图 BH1750传感器代码 #include "bh1750.h& ...

  3. 初出茅庐的小李第3篇博客《5G物联网及NB-IoT技术详解》读书笔记1

    初出茅庐的小李第3篇博客 <5G物联网及NB-IoT技术详解>读书笔记1 在Mculover666那里白嫖了一本书,不要问我咋白嫖的,我也不知道- 为什么要写这样的笔记? 因为我白嫖的时候 ...

  4. 初出茅庐的小李第39篇博客之转载一篇有关unistd.h的介绍文章

    转载一篇文章 mask一下好找 unistd.h在unix中类似于window中的windows.h! #ifdef WIN32 #include <windows.h> #else #i ...

  5. 初出茅庐的小李第19篇博客之广和通G510模块接入机智云平台

    2020年5月1日劳动节 为什么要说一下这个日期,因为我上一次玩(学)G510模组是去年2019年5月1日,由于种种原因吧,一直也没有机会再次操作,而且不幸的一件事情就是,我还把上次搞的代码搞丢了,也 ...

  6. 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用

    offsetof(type, member-designator) 这是一个宏定义包含在<stddef.h>里,它的作用是用来计算一个结构成员相对于结构开头的字节偏移量. 说到这里我先来补 ...

  7. 初出茅庐的小李第86篇博客之Modbus协议总结

    Modbus协议来源 Modbus协议的由来 Mod,取自英文单词" Modicon",Modicon 中文翻译为莫迪康,是美国一家自动化公司的名字,现在这家公司被法国的施耐德电气 ...

  8. 初出茅庐的小李第59篇博客之测试Modbus协议的继电器

    1, Modbus RTU指令详解 发送: FF 05 00 00 FF 00 99 E4 字段 含义 注释 FF 设备地址 范围1-255,默认255 05 功能码 写单个线圈 00 00 继电器地 ...

  9. 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

    旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...

最新文章

  1. 05 Java程序员面试宝典视频课程之Jquery
  2. NUnit学习笔记之进阶篇
  3. Windows 编程之 对话框总结
  4. 实现DDD领域驱动设计: Part 2
  5. 2020 年开发者生态报告:Python超越Java,Go、Kotlin强势崛起
  6. Cracer8-模块和正则表达式
  7. 【机器人】人类反应与机器的浑然一体—营救机器人诞生
  8. 一稿过的Banner模板素材!做电商的你一定需要
  9. hbase的2.2.4版本支持哪个版本的hadoop_2019 年,Hadoop 还是数据处理的可选方案吗?...
  10. python从大到小排序_python作业:用嵌套的列表存储学生成绩数据,并编程完成如下操作...
  11. sql raiserror_SQL Server PRINT和SQL Server RAISERROR语句
  12. 十八款为设计师提供的免费工具
  13. TensorFlow入门:计算图和梯度流
  14. 常用EXE文件反编译工具
  15. 目前,国内的互联网发展趋势
  16. 2021-08-29 网安实验-网络协议栈渗透测试之DDOS攻击之CC攻击
  17. 入手评测AMD锐龙r7 6800u和酷睿i7 1260p选哪个 r76800u和i71260p对比
  18. 在vue项目中使用高德地图JS API
  19. 【String字符串分割以及字符串截取】
  20. SAP CRM CL_CRM_BOL_ENTITY实例的sendable属性是什么时候置位的

热门文章

  1. NLP系列——(4)文本表示
  2. 工商注册身份验证 v1.0.1
  3. ⚡混沌世界中的醒与痴——醒哥与九妹⚡
  4. B2B2C多用户商城系统建设需要注意哪些问题
  5. 线性表之链表复习(仅王道单链表题目)
  6. 神经网络测试结果中的Top-1和Top-5是什么意思
  7. pd.read_csv,Error tokenizing data. C error: Expected 1 fields in line 2786, saw 2
  8. iPhone 12 销量破亿,直追「钉子户神机」的底气是什么?
  9. JS对象数组中依据某个属性的值分组
  10. 电子琴节奏包制作_XR情报局:如何在网页端轻松制作Beat Saber关卡?