求助!STM32大神哪家强?中国电子发烧友论坛
时间:10-02
整理:3721RD
点击:
- #include "stm32f10x.h"
- #include <stdio.h>
- void usart_init(void)
- {
- RCC->APB2ENR |=(1<<14); //开串口时钟
- RCC->APB2ENR |=(1<<2); //开GPIOA时钟。
- GPIOA->CRH &=~(0Xf<<4*1);
- GPIOA->CRH |=0xB<<4*1; //PA9 复用推挽输出,最大速度50M
- GPIOA->CRH &=~(0Xf<<4*2);
- GPIOA->CRH |=(4<<4*2); //PA10 浮空输入
- //串口使能 | 8数据位 | 发送 |接收使能
- USART1->CR1 |= (1<<13) | (1<<12) | (1<<3) | (1<<2);
- USART1->CR1 &=~(1<<10);
- USART1->CR2 &=(~(1<<12))|(1<<13); // 1个停止位
- USART1->BRR |=0x1d4c; //将波特率设置为9600.72M时钟下
- }
- int fputc(int ch, FILE *f)
- {
-
- USART_SendData(USART1, (unsigned char) ch);
- while (!(USART1->SR & USART_FLAG_TXE));
-
- return (ch);
- }
- void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
- {
- assert_param(IS_USART_ALL_PERIPH(USARTx));
- assert_param(IS_USART_DATA(Data));
- USARTx->DR = (Data & (uint16_t)0x01FF);
- }
- int main(void)
- {
- usart_init(); //串口初始
- while(1)
- {
- printf("123456abc");
- }
- }
显示乱码,打印出来的是点点点.,乱码。不知为何,求解。
问题(1):上程序该如何矫正。
问题(2):如果不用重定向,能不能把字符变为8位二进制数再送入USART1 ->DR 寄存器的 bit [8:0]位中?该如何操作?以下函数可以吗?
- void send_data(char * ch,int n) // 'A'=65 n为字符个数
- {
- u32 i;
- int str;
- for(i=0;i<n;i++)
- {
- str=(ch【i】<i>)<i><i><i>/16<<4+ch【i】<i><i><i><i>%16; // 65/16=4 4<< 4 + 65%16=0X40 + 1 = 0x41 =A字符的
- USART1->DR =str; //二进制码
- }
- }</i></i></i></i></i></i></i></i>
其实我也知道上面程序不能实现,ch【i】只能表示字符,不能表示字符代替的ASCII码,但是我不知道该怎么修改。
我意思是能不能像51串口那样,直接把要发送的字符送到缓冲寄存器SBUF中,然后它自己会自动发送?