大侠们,还在为我等小菜的问题过于肤浅而苦恼?

[复制链接]
1549|2
 楼主| ff8zgs 发表于 2012-5-28 12:51 | 显示全部楼层 |阅读模式
stm32 串口在ucos系统下不能正常输出。如果发送单字节的话 只有在开机的时候会有2个0xff,不管我发送什么内容。如果是以字符串的方式发送,有些内容能发送比如{1,2,3,4,5}但是开始的头第一帧数据是不对的,而且在后面大概23帧左右,也会出现发送内容错误,但是再之后所有的内容都正确。如果发送的内容是{10,11,12,13,14}之类现象就跟发送单字节一样,只有开机发送0xff之后就无反应,板子没死机。
  1. void Usart1_Configuration(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.                 USART_InitTypeDef USART_InitStructure;

  5.         USART_ClockInitTypeDef USART_ClockStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;
  7.        
  8.         /* Enable USART1, GPIOA, GPIOx and AFIO clocks */
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  10.         /* Configure the NVIC Preemption Priority Bits */  
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  12.   
  13.         /* Enable the USART1 Interrupt */
  14.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  15.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  16.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  17.         NVIC_Init(&NVIC_InitStructure);

  18.         /* Configure USART1 Rx (PA.10) as input floating */
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  21.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  22.   
  23.         /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  27.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  28.         USART_InitStructure.USART_BaudRate = 9600;
  29.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  30.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  31.         USART_InitStructure.USART_Parity = USART_Parity_No;
  32.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  33.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  34.        
  35.         USART_ClockStructure.USART_Clock = USART_Clock_Disable;         
  36.         USART_ClockStructure.USART_CPOL = USART_CPOL_Low;
  37.         USART_ClockStructure.USART_CPHA = USART_CPHA_2Edge;
  38.         USART_ClockStructure.USART_LastBit = USART_LastBit_Disable;
  39.         /* Configure USART1 */
  40.         USART_Init(USART1, &USART_InitStructure);
  41.         USART_ClockInit(USART1,&USART_ClockStructure);
  42.         /* Enable USART1 Receive and Transmit interrupts */
  43.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  44. //USART_ClearITPendingBit(USART1,USART_IT_TXE);
  45.         //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  46.        
  47.         /* Enable the USART1 */
  48.         USART_Cmd(USART1, ENABLE);
  49. //        USART_ClearFlag(USART1,USART_FLAG_TC);
  50. }

  51. //这是串口配置函数
  52. void Usart1_Send_Char(unsigned char k)
  53. {
  54.                 USART_SendData(USART1,k);

  55.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){;}

  56. }

  57. void USART1_Send_Str(unsigned char *s)
  58. {
  59.         int i;
  60.         int len=strlen(s);
  61.         //strcpy(Rx1Buffer,s);
  62.         //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  63.         for(i=0;i<len;i++)
  64.         Usart1_Send_Char(s[i]);
  65. }

  66. //这是发送单字节和字符串函数

  67. 这些功能在裸机下都是正常的。望各位大虾不吝赐教,
 楼主| ff8zgs 发表于 2012-5-28 12:53 | 显示全部楼层
这个问题困扰我好几天了,如果谁能给我实质的解决方法或者正确方向,我一定在21论坛每天盖楼感谢他
airwill 发表于 2012-5-29 09:09 | 显示全部楼层
既然 "这些功能在裸机下都是正常的。" 我怀疑你移植过来的  UCOS 也使用了这个 USART 做调试用, 当然还有可能 IO 口争用冲突.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

199

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部