完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
哪位大神帮小弟弟看看程序,程序烧进去后串口的数据是:F6 F4 ,小弟不解请求大神帮忙看看 ,谢谢!
程序如下: #include "STM32f10x.h" #include #define GPIO_LED1 GPIO_Pin_2 #define GPIO_LED2 GPIO_Pin_3 #define GPIO_LED3 GPIO_Pin_4 #define GPIO_LED4 GPIO_Pin_7 #define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4 #define UART2_TX_IO GPIO_Pin_5 #define UART2_RX_IO GPIO_Pin_6 void Init(void); void InitClock(void); void InitGPIO(void); void InitUart(void); void Delayms(u32 Z); void Delayus(u32 Z); void FailCLKInit(void); void UartSendChar(u8 TXBuf); void UartSendString(const u8 *ADDPointer); void UartReceiveChar(u8 RXBuf) ; int main(void) { Init(); while(1) { GPIO_SetBits(GPIOD , GPIO_LED_ALL); UartSendChar(0x38); Delayms(800); GPIO_ResetBits(GPIOD , GPIO_LED_ALL); UartSendChar(0x31); Delayms(800); } } void Init(void) { InitClock() ; InitGPIO(); InitUart(); } void InitClock(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); // HSE = 25MHz if(SUCCESS == RCC_WaitForHSEStartUp()) { // FLASH_PrefetchBufferCmd(ENABLE); // ?? // FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); // AHB CLOCK(HCLK) = SYSTEM CLOCK /1 RCC_PCLK1Config(RCC_HCLK_Div2); // APB1 CLOCK = HCK/2 max 36MHz RCC_PCLK2Config(RCC_HCLK_Div1); // APB2 CLOCK = HCK/1 max 72MHz // debug RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2); // PLLSOURCECLK = HSECLK/1 , PLLCLKOUT = SOURCECLK *2 RCC_PLLCmd(ENABLE); // START PLL while(RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); // WAIT PLLCLK READY RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //SYSTEMCLK = PLLCLKOUT 25*2 = 50 MHz while(RCC_GetSYSCLKSource() != 0x08) ; // WAIT SYSTEMCLK = PLLCLKOUT SUCCESFUL RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); } else FailCLKInit(); } void InitGPIO(void) { GPIO_InitTypeDef GPIOD_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); // ENABLE GPIOD CLOCK GPIOD_InitStructure.GPIO_Pin = GPIO_LED_ALL; GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // PUSH-PULL OUTPUT GPIO_Init(GPIOD, &GPIOD_InitStructure); GPIOD_InitStructure.GPIO_Pin = UART2_TX_IO; GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // PUSH-PULL OUTPUT GPIO_Init(GPIOD, &GPIOD_InitStructure); GPIOD_InitStructure.GPIO_Pin = UART2_RX_IO; GPIOD_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG; // PUSH-PULL INPUT GPIO_Init(GPIOD, &GPIOD_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE) ; // REMAP GPIO GPIO_SetBits(GPIOD , GPIO_LED_ALL); // LED OFF } void FailCLKInit(void) { } void InitUart(void) { USART_InitTypeDef USART2_InitStructure; float temp; u16 mantissa; u16 fraction; temp=(float)(25*1000000)/(115200*16);//得到USARTDIV mantissa=temp; //得到整数部分 fraction=(temp-mantissa)*16; //得到小数部分 mantissaDR = TXBuf ; while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC)); // USART_ClearFlag(USART2,USART_FLAG_TC); USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); } void UartSendString(const u8 *ADDPointer) { } void UartReceiveChar(u8 RXBuf) { } void Delayms(u32 Z) { while(Z--) Delayus(1000); } void Delayus(u32 Z) // SYSCLK = HCLK = 25MHz *2 , MAX Z= 0X00FFFFFF/50 = 335 544 { SysTick->LOAD=50*Z; //装载计数值,因为时钟50M,50次才1μs SysTick->CTRL=0x00000005; //时钟来源设为HCLK=50MHz,禁止异常中断请求,打开定时器 while(!(SysTick->CTRL&0x00010000)); //等待计数到0 SysTick->CTRL=0x00000000; //关闭定时器 } /****************************** Interrupt **************************/ |
|
相关推荐
7个回答
|
|
//USART2_InitStructure.USART_BaudRate = 9600;
// 115200 ,N ,1 USART2->BRR= mantissa ; 这两句改一下,改成 USART2_InitStructure.USART_BaudRate = 115200; // 115200 ,N ,1 // USART2->BRR= mantissa ; void UartSendChar(u8 TXBuf) { USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC)); // USART_SendData(USART2,TXBuf); USART2->DR = TXBuf ; while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC)); // USART_ClearFlag(USART2,USART_FLAG_TC); USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); } 这个函数内容改一下,改成下面的内容,再试试吧 void UartSendChar(u8 TXBuf) { while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2,TXBuf); } |
|
|
|
如果要发送字符串,可以用
void send_str_usart2(unsigned char *p,unsigned char len) { unsigned char i; for (i=0; i |
|
|
|
如果要发送字符串,可以用
void send_str_usart2(unsigned char *p,unsigned char len) { unsigned char i; for (i=0; i |
|
|
|
回复第 2 楼 于2013-09-05 14:56:13发表:
//USART2_InitStructure.USART_BaudRate = 9600; // 115200 ,N ,1 USART2->BRR= mantissa ; 这两句改一下,改成 USART2_InitStructure.USART_BaudRate = 115200; // 115200 ,N ,1 // USART2->BRR= mantissa ; void UartSendChar(u8 TXBuf) { USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC)); // USART_SendData(USART2,TXBuf); USART2->DR = TXBuf ; while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC)); // USART_ClearFlag(USART2,USART_FLAG_TC); USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); } 这个函数内容改一下,改成下面的内容,再试试吧 void UartSendChar(u8 TXBuf) { while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2,TXBuf); } 谢谢您的回复!按照你说的 我改了一下, 可串口一直发 FF 与 FD (二进制显示接收的) |
|
|
|
回复第 3 楼 于2013-09-05 17:44:33发表:
如果要发送字符串,可以用 void send_str_usart2(unsigned char *p,unsigned char len) { unsigned char i; for (i=0; i { USART_SendData(USART2,*p); while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET); p++; } } 给个例子:send_str_usart1(water_temp,sizeof water_temp); 其中water_temp存放你要发送的数据的数组。 谢谢您的回复! 现在是串口发的数据不对,不知道哪儿出问题了 |
|
|
|
问题已经解决,STM32 头文件很重要。
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2049 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1893 浏览 3 评论
4485 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2040 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2549 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 15:23 , Processed in 0.793513 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号