Alcohol Sensor(1)
计划用usart转adc传信息。首先应使能usart。
usart注意的点:

下图是对于复用的AFRL寄存器要配置的,每个IO口要用到4个位,要使用USART1/2应该选用AF7,因此配置AFRL寄存器
AFRL寄存器如下,若要配置串口GPIO_A2,则应该配置下图的AFRL2为0111(如下图对应的AF7)
具体配置可参考如下:

配置GPIOx_AFRL或GPIOx_AFRH寄存器,将IO指定到所要功能对应的AFx

/*PA9 指定为AF7,复用为USART1_TX */
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); /* PA10 指定为AF7,复用为USART1_RX*/
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);

这些格式是官方约定的,必须按照规定填写,而不能随意填写。
第一个参数为port组,GPIOx(x=A~K)
第二个参数为pin,GPIO_PinSourcey(y=0~15),这里不用管AFRL或AFRH,官方函数会处理。
第三个参数,官方定义为:


#define IS_GPIO_AF(AF)
(((AF) == GPIO_AF_RTC_50Hz) ||((AF) == GPIO_AF_TIM14)   || \
((AF) == GPIO_AF_MCO)       || ((AF) == GPIO_AF_TAMPER) || \
((AF) == GPIO_AF_SWJ)       || ((AF) == GPIO_AF_TRACE)  || \
((AF) == GPIO_AF_TIM1)      || ((AF) == GPIO_AF_TIM2)   || \
((AF) == GPIO_AF_TIM3)      || ((AF) == GPIO_AF_TIM4)   || \
((AF) == GPIO_AF_TIM5)      || ((AF) == GPIO_AF_TIM8)   || \
((AF) == GPIO_AF_I2C1)      || ((AF) == GPIO_AF_I2C2)   || \
((AF) == GPIO_AF_I2C3)      || ((AF) == GPIO_AF_SPI1)   || \
((AF) == GPIO_AF_SPI2)      || ((AF) == GPIO_AF_TIM13)  || \
((AF) == GPIO_AF_SPI3)      || ((AF) == GPIO_AF_TIM14)  || \
((AF) == GPIO_AF_USART1)    || ((AF) == GPIO_AF_USART2) || \
((AF) == GPIO_AF_USART3)    || ((AF) == GPIO_AF_UART4)  || \
((AF) == GPIO_AF_UART5)     || ((AF) == GPIO_AF_USART6) || \
((AF) == GPIO_AF_CAN1)      || ((AF) == GPIO_AF_CAN2)   || \
((AF) == GPIO_AF_OTG_FS)    || ((AF) == GPIO_AF_OTG_HS) || \
((AF) == GPIO_AF_ETH)       || ((AF) == GPIO_AF_OTG_HS_FS) || \
((AF) == GPIO_AF_SDIO)      || ((AF) == GPIO_AF_DCMI)   || \
((AF) == GPIO_AF_EVENTOUT)  || ((AF) == GPIO_AF_FSMC))
配置AF的输入输出模式
GPIO_InitTypeDef GPIO_InitStrue;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;            //发送端-TXD
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;      //推挽输出
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;           //接收端-RXD
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);

需要用串口输入输出的脚,要复用的引脚如下

对于复用功能映射配置,需要注意的点如下


(因为要使用ADC,因此此处要特别注意)

配置需要的条件如下:

1.串口通讯初始化结构体

typedef struct{uint32_t USART_BaudRate;            //波特率BRR
//根据公式计算或者使用给定的波特率(115200、76800)
uint16_t USART_wordLength;          //字长CR1_M
//定义USART_WordLength_8b或USART_WordLength_9b,分别代表8bit和9bit
uint16_t USART_StopBits;            //停止位 CR2_STOP
//可配置为USART_StopBits_1、USART_StopBits_0_5
//USART_StopBits_2、USART_StopBits_1_5四种
uint16_t USART_Parity;              //校验控制CR1_PCE、CR1_Ps
//配置奇偶校验位USART_Parity_No(不校验)、USART_Parity_Even(偶校验)
//USART_Parity_Odd(奇校验)
uint16_t USART_Mode;                //模式选择CR1_TE、CR1_RE
//USART_Mode_Rx | USART_Mode_Tx;接收模式和发送模式
uint16_t USART_HardwareFlowControl; //硬件流选择CR3_CTSE、CR3_RTSE
//USART_HardwareFlowControl_None 、USART_HardwareFlowControl_RTS
//USART_HardwareFlowControl_CTS、USART_HardwareFlowControl_RTS_CTS
//硬件流控制选择,只有在硬件流控制模式下才有效,可选有,使能RTS、使能CTS、同时使能RTS和CTS、不使用硬件流。
} USART_InitTypeDef;

2.同步时钟初始化结构体

typedef struct
{uint16_t USART_Clock;           //同步时钟CR2_CLKEN
uint16_t USART_CPOL;            //极性 CR2_CPOL
uint16_t USART_CPHA;            //相位 CR2_CPHA
uint16_t USART_LastBit;         //最后一个位的时钟脉冲 CR2_LBC
} USART_ClockInitTypeDef;

时钟极性
时钟相位

3.配置GPIO、串口、中断

1-//配置GPIO为具体的第二功能,该函数称为GPIO复用功能配置函数
void GPIO_PinAFConfig
(GPIO_TypeDef*GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
//第一形参是GPIO端口,第二形参为Pin,第三形参指定复用具体功能,可配置见下图
2-//中断配置函数
void USART_ITConfig
(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)
//第二形参具体配置见下方图,第三形参NewState可赋值为ENABLE或DISABLE
3-//串口使能函数(大开关)
void USART_Cmd(USART_TypeDef* USARTx,FunctionalState NewState)
//第二形参NewState可赋值为ENABLE或DISABLE
4-//数据发送函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
5-//数据接收函数
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
6-//中断状态位获取函数(获取标志位)
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
//第一个形参是串口,第二个形参是串口获取到哪一个中断标志,可配置标志见下图

需要使用的串口标志

串口中断服务函数

void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE))// 接收到数据{res= USART_ReceiveData(USART1); // 获得串口1接收到的数据USART_SendData(USART1,res);     // 通过串口1发送数据}
}

端口功能为复用功能配置过程如下:

上图的③如上文所述,除了是ADC和DAC时需要配置为模拟输入模式之外,其他的外设都需要配置为复用功能。而此实验中需要使用ADC,因此需要配置为模拟输入:

由于
typedef enum
{ GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;因此应该如下配置
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN;

void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10//USART1 初始化设置USART_InitStructure.USART_BaudRate = bound;//波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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); //初始化串口1USART_Cmd(USART1, ENABLE);  //使能串口1 //USART_ClearFlag(USART1, USART_FLAG_TC);#if EN_USART1_RX   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;     //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、#endif}


其中0x0D是回车,0x0A是换行。每接收到一个有效数据,最低位加1。若出现0x0D则将bit14置1,而紧接着出现0x0A,则将bit15置1,表示接收完成。

Alcohol Sensor(1)相关推荐

  1. cmos sensor (图像传感器) CSI接口

    Chapter 39(Page 1429) CMOS Sensor Interface(CSI) 本章介绍了CMOS图像传感器接口(CSI)的架构,操作守则以及编程原型.该CSI接口能够使得MX27直 ...

  2. AI芯片:寒武纪NPU设计分析(DianNao)

    国内人工智能处理器独角兽寒武纪,在这个领域,算是走在了世界前沿,经过最近几年的迅猛发展,取得了辉煌的成果. 最近花了些时间研究了下寒武纪发表的一系列论文中介绍的NPU的结构. 记录下来,算是对最近学习 ...

  3. 物联网外设学习笔记-摄像头(一)

    物联网外设学习笔记-摄像头(一) Camera 简介 摄像头(CAMERA)又称为电脑相机.电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议.远程医疗及实时监控等方面.近年以来,随着互联 ...

  4. 【转】AI芯片:寒武纪NPU设计分析(DianNao)

    转自:https://blog.csdn.net/evolone/article/details/80765094 国内人工智能处理器独角兽寒武纪,在这个领域,算是走在了世界前沿,经过最近几年的迅猛发 ...

  5. camera 的学习笔记(一)

    camera 模块概念 DBB:数字基带芯片; ABB:模拟基带芯片; PMU:电源管理芯片; DSP:后端芯片,图像处理芯片,它的作用是将感光芯片获得的数据及时快速地传递中央处理器并刷新感光芯片,因 ...

  6. linux V4L2子系统——v4l2架构(3)之video_device

    linux V4L2子系统--v4l2架构(3)之video_device 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: ...

  7. 解析低压差线性稳压器(LDO)在摄像头应用中的创新设计

    维安低压差线性稳压器(LDO)手机摄像头供电方案 近年来,随着5G.AI.生物识别等技术的不断发展,摄像头也迎来了升级迭代.无论是清晰度还是智能化程度抑或是应用场景,都在不断加强和丰富,远程医疗.远程 ...

  8. Google Maps Api Geocoding 传递参数和返回参数的解析(Json)

    转https://blog.csdn.net/zkdemon/article/details/7019117 Google Geocoding API    http://code.google.co ...

  9. Linux V4L2子系统-Video设备框架分析(二)

    1.概述 在V4L2子系统中,Video设备是一个字符设备,设备节点为/dev/videoX,主设备号为81,次设备号范围为0-63.在用户空间,应用可以通过open/close/ioctl/mmap ...

最新文章

  1. 《强化学习周刊》第26期:UCL UC Berkeley发表深度强化学习中的泛化研究综述、JHU推出基于强化学习的人工决策模型...
  2. 万字长文解读运营商搏击5G:一场比拼财力的三国杀
  3. 2021 4 21 管理心得
  4. Hive _函数(系统内置函数、自定义函数、自定义UDF函数)
  5. oracle包写入程序失败_Oracle内核技术揭秘第一篇
  6. 如何理解,互联网架构“高并发”?
  7. matlab函数紫色代码,MATLAB 语法高亮颜色设置 - MATLAB - MathWorks 中国
  8. 2.口袋西游寻路call
  9. android 投屏与控制,android投屏pc及电脑adb控制手机
  10. 一名运维工程师的第一个五年
  11. shell法宝之sed,修改文件内容的好帮手
  12. Java常用命令:jps、jstack、jmap、jstat(带有实例教程)
  13. CWP控制面板登录异常
  14. 我如何构建一个交互式仪表板Web应用程序以可视化拳击数据
  15. Android开发类似苹果iOS 7的沉浸式状态栏
  16. C++入门编程之成语接龙
  17. Python学习必备:10个奇妙的Python库,看完后我惊呆了
  18. 我和python的第一次亲密接触
  19. U9系统报错:Enterprise[9999] 不存在
  20. 组态王7.5 WEB 发布教程

热门文章

  1. JAVA BufferedWriter的newLine方法
  2. 童年学习机器人的 5 大好处
  3. 走马观花-浪里跳-学习英文
  4. 喜马拉雅随车听开通啦
  5. 蓝绿发布、灰度发布(金丝雀发布) 和滚动发布
  6. 网络WireShark进行抓包
  7. 云班课作业互评(python3+selenium)
  8. 看日漫学日语:日漫里常看到的日语100句(建议收藏)
  9. 计算机网络启动慢,电脑开机后网络连接图标出现的太慢了,2分钟才能出现,不出现什么都做不了,怎么办?如果手动设置...
  10. uva 10158 War