现在网上许多STM32操作方法都是通过库函数来写STM32,即使特意搜索通过寄存器操作STM32许多时候也找不到相对应的方法,那么我就想通过自己的摸索来记录这一过程,同时也是给大家一个思路,有什么不对请指正,那么下面我们就开始。(使用芯片为STM32F407VET6)
注:一下方法经供参考和提供思路,不保证完全正确!!!
串口的通讯原理和过程我就不展开了,网上都有,大家可以自行搜索。
一,初始化
以上部分是计算波特率的方法,大家可以先手算一下实质上就是通过计算把整数部分和小数部分单独拿出来来,因为在32里面小数和整数部分是分开存放的。
二,端口初始化
大家可以对自己使用的串口端口进行相应的初始化,开端口时钟,配置模式,输出速度,有重映射的配置重映射,这里我就不放出来了(P.S.其实我就是懒,没写)
三,配置串口通信
这个大家可以对照自己需要的协议来配置,我这边把官方的寄存器的位数贴上来
这里特别说一下,上文说到32的波特率的问题
在这里就可以看出来波特率的小数和整数部分是分开放置的,所以前面的计算就是将波特率的整数和小数拆开分别存放。
寄存器我就不详细说明了,官方手册上说的很清楚,大家可以对照这每一位看看那些要用。
四,串口的收与发
这一块在网上通过寄存器操作的方法特别少,官方的函数库我也看了个七七八八,所以我就特别列出来了
(1)发送单个数据
其实这个很简单就是将数据送到USART_DR寄存器去,后面就是芯片内部硬件的事了
大家可以看一下官方对这个寄存器的描述
(2)发送一串数据
我们来分析一下这个函数,第一句话就是发送一个数据,就是把数据移到USART_DR寄存器中,然后就是
while((USART1->SR&(1<<7))==1);
大家注意这句话啊,语法!!!while后面是分号,就是空语句。我们结合参考手册来分析一下
我们看第七位,官方手册说了当内容移到移位寄存器的时候由硬件置零,其实这边说的移位寄存器就是芯片内部的事了,大家大可将其视作是数据已经发送出去了,而这句话实质上就是等待,等待硬件的这个信号,当这个信号到来的时候说明数据已经发送出去,这时再发送下一位。虽然很简单,不过我在网上一直没有找到这个问题,最后对照这官方库写出来了,因为这个语法问题我写了一下午。
(3)收
这个没什么好说的,就是当芯片收到数据,一个中断过来,大家可以对收到的数据进行处理。
最后贴上我写的串口的几个函数
void senddata1(unsigned char data1){USART1->DR=data1&(unsigned short int)0x01FF;}
void sendstring1(unsigned char *string1)
{
unsigned char i=0;
do
{
senddata1(string1[i]);
while((USART1->SR&(1<<7))==1);
i++;
}while(string1[i]!=0);
}
void usart1_init(u32 pclk1,u32 bound1)
{
float temp1;
u16 mantissa1;
u16 fraction1;
temp1=(float)(pclk1*1000000)/(bound1*16);
mantissa1=temp1;
fraction1=(temp1-mantissa1)*16;
mantissa1<<=4;
mantissa1+=fraction1;
RCC->AHB1ENR|=1<<0;
RCC->APB2ENR|=1<<4;
GPIOA->MODER|=2<<18;
GPIOA->MODER|=2<<20;
GPIOA->OSPEEDR|=2<<18;
GPIOA->OSPEEDR|=2<<20;
GPIOA->AFR[1]|=7<<4;
GPIOA->AFR[1]|=7<<8;
RCC->APB2RSTR|=1<<4;
RCC->APB2RSTR&=~(1<<4);
//²¨ÌØÂÊÉèÖÃ
USART1->BRR=mantissa1;
USART1->CR1|=0X200C;
//ʹÄܽÓÊÕÖжÏ
USART1->CR1|=1<<5;
MY_NVIC_Init(3,3,USART1_IRQn,2);
}
以上就是我对32的一点个人理解,仅供参考,有什么错误还请大家指正