用福昕PDF阅读器在中文datasheet中找到USART的寄存器配置:
深入底层函数:
USART CR2 CR1寄存器的配置
/*---------------------------- USART CR2 Configuration -----------------------*/ tmpreg = USARTx->CR2;//先读取12.13位的数据 /* Clear STOP[13:12] bits */ tmpreg &= CR2_STOP_CLEAR_Mask; /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/ /* Set STOP[13:12] bits according to USART_StopBits value */ tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;//用或运算清除 /* Write to USART CR2 */ USARTx->CR2 = (uint16_t)tmpreg;//再写回寄存器
/*---------------------------- USART CR1 Configuration -----------------------*/ tmpreg = USARTx->CR1; /* Clear M, PCE, PS, TE and RE bits */ tmpreg &= CR1_CLEAR_Mask; /* Configure the USART Word Length, Parity and mode ----------------------- */ /* Set the M bits according to USART_WordLength value */ /* Set PCE and PS bits according to USART_Parity value */ /* Set TE and RE bits according to USART_Mode value */ tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | USART_InitStruct->USART_Mode; /* Write to USART CR1 */ USARTx->CR1 = (uint16_t)tmpreg;
清零:
配置好后,往串口发数据,发了个\n(换行)是个字符ASCII码为=>0x0a
把数据发了,一定要等
深入 USART_SendData函数:
数据直接往DR寄存器里写,OK数据就发送出去了
深入DR寄存器:是个32位的寄存器,只用了bit0-bit8,9个位,一般发8个位,有时发9个位,发9个位时,基本数据类型最少要能存放16个位,short,2个字节,16个位。
但以后编程永远不要用usigned short !!!保持程序的通用性,直接使用
就好了,假设一后想发在stm8上跑,有可能另外一个cpu中unsigned short 有可能是一个字节(8位),所以直接调用uint16_t,另外的单片机的库就会写,typedef unsigned int uint16_t,这是他一定会给你保证他是8、16、32、64个位的
假如收到的值大于九个位,与0X01FF (0000 0001 1111 1111 )b与运算
&
=>
高位我都不要,对我来说没意义,我只要那九个位
深入分析Usart_GetFlagStatus()函数:
读SR寄存器,判断
一定是个宏
0x0040 =>0000 0000 0100 0000 第六个位 =>寄存器中TC位
读值,位操作:(x&1 =x ,x&0=0)
如果,SR(保留x xxTCx xxxx)&0x40=RESET(0) ,那么TC位(bit6)=0 ,也就是TC位发送还未完成
如果,SR(保留x xxTCx xxxx)&0x40≠RESET(0),那么TC位(bit6)=1 ,也就是TC位发送完成
什么时候数据发完呢?由寄存器SR的TC位判断
一直读TC位,你是不是1,是不是1,是不是1,是不是1,只要是1就完事儿了,串口一般不用中断,用轮询。
对于串口一、挂在clk1上
没有误差
会有误差 ,115384是实际值,
对于串口2、3
没有误差
用keil4
发到串口一上,要发到串口2,就UASRT1/USART2
有了这个函数才有printfl函数,及输出对象,调printfl时候=>调FPUTC,还要含stdio.h库
选这个库(微库)才有printfl,编译器本身自带的库。
作业
要安装驱动。在ftp站点上
1:42
receive用中断。