完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这篇文章是本人从小白到熟悉这个单片机的过程,本在使用过程中主要是针对的64为单片机,但是其它引脚位数的单片机应该也是比较实用,由于篇幅较长,
废话不多说,开始单片机学习之旅吧!(本文章比较适用于对硬件知识有一定基础,如果有51系列单片机开发或者学习经验者。) 最开始笔者是从串口初始化开始,串口是个很好用的东西。不光可以用来通信而且还可以用来调试调试程序。下面这段程序是对串口1-3的初始化函数。这三段函数基本上没有什么区别只是引脚不同,所以后面的程序没加注释。 /* ******串口1初始化***************************************** * 函数名称:Usart1_Init * * 函数功能: 串口1初始化 * * 入口参数: baud:设定波特率 * * 返回参数: 无 * * 说明: TX-PA9 RX-PA10 ************************************************************ */ void Usart1_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //打开USART1的时钟 //PA9 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用模式 gpioInitStruct.GPIO_Pin = GPIO_Pin_9; //初始化Pin9 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA //PA10 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置为浮空模式 gpioInitStruct.GPIO_Pin = GPIO_Pin_10; //初始化Pin10 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA usartInitStruct.USART_BaudRate = baud; //设置串口波特率 usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送 usartInitStruct.USART_Parity = USART_Parity_No; //无校验 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位 USART_Init(USART1, &usartInitStruct); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断 nvicInitStruct.NVIC_IRQChannel = USART1_IRQn; //usart1中断号 nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; //中断通道使能 nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占中断优先级(值越小优先级越高) nvicInitStruct.NVIC_IRQChannelSubPriority = 1; //子中断优先级(值越小优先级越高) NVIC_Init(&nvicInitStruct); //初始化NVIC } /* ******串口2初始化***************************************** * 函数名称:Usart2_Init * * 函数功能: 串口2初始化 * * 入口参数: baud:设定波特率 * * 返回参数: 无 * * 说明: TX-PA2 RX-PA3 ************************************************************ */ void Usart2_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //PA2 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; gpioInitStruct.GPIO_Pin = GPIO_Pin_2; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); //PA3 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpioInitStruct.GPIO_Pin = GPIO_Pin_3; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usartInitStruct.USART_Parity = USART_Parity_No; usartInitStruct.USART_StopBits = USART_StopBits_1; usartInitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART2, &usartInitStruct); USART_Cmd(USART2, ENABLE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); nvicInitStruct.NVIC_IRQChannel = USART2_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* ******串口3初始化***************************************** * 函数名称:Usart3_Init * * 函数功能: 串口3初始化 * * 入口参数: baud:设定波特率 * * 返回参数: 无 * * 说明: TX-PB10 RX-PB11 ************************************************************ */ void Usart3_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART3_TX GPIOB.10 gpioInitStruct.GPIO_Pin = GPIO_Pin_10; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &gpioInitStruct); //USART3_RX GPIOB.11 gpioInitStruct.GPIO_Pin = GPIO_Pin_11; gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &gpioInitStruct); usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usartInitStruct.USART_Parity = USART_Parity_No; usartInitStruct.USART_StopBits = USART_StopBits_1; usartInitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART3, &usartInitStruct); USART_Cmd(USART3, ENABLE); USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); nvicInitStruct.NVIC_IRQChannel = USART3_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* *********串口打印函数****************** *函数名称:UsartPrintf *参数: *USARTx:选择打印的端口 * fmt:需要打印的数据 * *说明: **************************** */ void USART_Printf(USART_TypeDef *USARTx, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; //指针pStr指向数组 va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); va_end(ap); while(*pStr != 0) { USART_SendData(USARTx, *pStr++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); } } 由于串口是异步通信方式,所以接收数据需要通过中断来接受。程序如下。 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //判断是否发生中断 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除当前中断标志位 ………………………… ………………………… //中断处理函数 } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //判断是否发生中断 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除当前中断标志位 ………………………… ………………………… //中断处理函数 } } void USART3_IRQHandler(void) { if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET) //判断是否发生中断 { USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清除当前中断标志位 ………………………… ………………………… //中断处理函数 } } 中断处理函数需要根据自己的功能来实现,到此整个串口初始化已经完成。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
740浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
577浏览 3评论
600浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
562浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 04:15 , Processed in 0.647030 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号