发新帖本帖赏金 5.00元(功能说明)我要提问
123下一页
返回列表
打印
[STM32F1]

PC串口发送至STM32,STM32回传给PC,悬赏已支付,问题已解决

[复制链接]
5739|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feihufuture|  楼主 | 2015-12-19 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 feihufuture 于 2016-1-31 18:32 编辑

就这么个简单的案例:PC串口发送至STM32串口2,STM32回传给PC串口。
这个工程是我自己新建的,在好几个别人的工程上修改都是OK的,为啥我自己新建的就出问题?
帮我调试OK的,直接100元(精通STM32的人只需要2分钟或许就能找出问题所在)
发送是OK的,因为能发送常数字符串到电脑;
接收不行,中断标志一直接收不到。



问题已经解决,是板子芯片出问题了,换芯片就好了!虽然不是软件问题,100元酬劳已支付给辛苦人员,他QQ是936239572,挺热心的!

UART.rar

4.53 MB

沙发
feihufuture|  楼主 | 2015-12-19 21:18 | 只看该作者
main.c
//---------------------------------------------------------------------------------------------------

typedef unsigned char       u8;
typedef unsigned short      u16;


#include "stm32f10x.h"


void RS232_Send_Data(unsigned char *send_buff, unsigned int length);


void USART_Configuration(void)
{

  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;

/**********************************************/

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  /*
  *  USART2_TX -> PA2 , USART2_RX ->        PA3
  */                               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 19200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, &USART_InitStructure);
        USART_ITConfig(USART2, USART_IT_TXE , ENABLE);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART2, ENABLE);
  USART_ClearITPendingBit(USART2, USART_IT_TC);
}


void RS232_Send_Data(unsigned char *send_buff,unsigned int length)
{
        unsigned int i = 0;
        for(i = 0;i < length;i ++)
        {                       
                USART2->DR = send_buff[i];
                while((USART2->SR&0X40)==0);       
        }       
}
//
#define RS232_REC_BUFF_SIZE                                100
extern unsigned char RS232_REC_Flag;
extern unsigned char RS232_buff[RS232_REC_BUFF_SIZE];
extern unsigned int RS232_rec_counter;

unsigned char a[12] = "abcdefghij  ";
int main(void)
{
        SystemInit();
  USART_Configuration();  
       
        while (1)
        {
               
               
                if(RS232_REC_Flag == 1)//
                {
                       
                RS232_REC_Flag = 0;
                RS232_Send_Data(RS232_buff,RS232_rec_counter); //
                RS232_rec_counter = 0;        //
                }
               
        }
}




使用特权

评论回复
板凳
feihufuture|  楼主 | 2015-12-19 21:20 | 只看该作者
stm32f10x_it.c文件
//--------------------------------------------------------------------------------------------------------


void USART2_IRQHandler(void)  
{

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//
        {       
                RS232_buff[RS232_rec_counter] = USART2->DR;//
                RS232_rec_counter ++;
/******************/
                if(RS232_rec_counter == 2)        //
                {
                                RS232_REC_Flag = 1;
                }
        }
}

使用特权

评论回复
地板
feihufuture|  楼主 | 2015-12-19 21:21 | 只看该作者

stm32f10x_it.h文件
//----------------------------------------------------------------------------------------

#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */

#define RS232_REC_BUFF_SIZE                                100
#define RS232_END_FLAG1        '?'                        //
#define RS232_END_FLAG2        ';'                        //
volatile unsigned char RS232_REC_Flag = 0;
volatile unsigned char RS232_buff[RS232_REC_BUFF_SIZE];//
volatile unsigned int RS232_rec_counter = 0;//
         
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void USART2_IRQHandler(void);  
#ifdef __cplusplus
}
#endif

#endif /* __STM32F10x_IT_H */

使用特权

评论回复
5
598330983| | 2015-12-19 21:38 | 只看该作者
#include"ctype.h"

DigitalOut led[4]={ DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)};

Serial pc(USBTX,USBRX);

char cmd;

char lednumber;

int main() {

    while (1)

    {

        pc.printf("Please send you command as L(O,T)1(2,3,4) ,L1 means light led1 \r\n");

        while (1)

        {

            cmd=pc.getc();

            if (cmd!= ' ')

                break;

        }

        while (1)

        {

            lednumber=pc.getc();

            if (lednumber!= ' ')

                break;

        }

        while (pc.getc()!='\r')

            ;

        while (pc.readable())

            pc.getc();

        cmd=toupper(cmd);

        int ledindex=lednumber-'0';

        switch(cmd)

        {

        case'L':

            led[ledindex-1]=1;

            break;

        case'O':

            led[ledindex-1]=0;

            break;

        case'T':

            led[ledindex-1]=!led[ledindex-1];

            break;

        }

    }



}

使用特权

评论回复
6
yklstudent| | 2015-12-19 21:45 | 只看该作者
USART_ITConfig(USART2, USART_IT_TXE , ENABLE);
这个初始化的时候别开启,等发送数据的再开启

使用特权

评论回复
7
feihufuture|  楼主 | 2015-12-20 09:43 | 只看该作者
本帖最后由 feihufuture 于 2015-12-20 09:55 编辑
yklstudent 发表于 2015-12-19 21:45
USART_ITConfig(USART2, USART_IT_TXE , ENABLE);
这个初始化的时候别开启,等发送数据的再开启 ...
不开启也不行。
你手头有板子没?帮我检查一下嘛,发送至PC没问题,就是STM32接收有问题;
由于全部是我新建的,我从stm32f10x.h中的系统时钟,外部时钟,外部设备,都已经检查过了

使用特权

评论回复
8
yklstudent| | 2015-12-20 10:01 | 只看该作者
feihufuture 发表于 2015-12-20 09:43
不开启也不行。
你手头有板子没?帮我检查一下嘛,发送至PC没问题,就是STM32接收有问题;
由于全部是我新 ...

身边没有STM32F1系列的板子,所以没法实际DEBUG调试;
你跟别人的范例对比下查找问题

使用特权

评论回复
9
sjnh| | 2015-12-20 10:18 | 只看该作者
你把USART_IT_TXE 中断关了;
你打开了TXE中断,但却用了查询发送,中断里又没有关TXE中断,所以这个中断一直会不停的进入、退出;
怀疑你程序现在是不停的进行TXE中断

使用特权

评论回复
10
feihufuture|  楼主 | 2015-12-20 10:28 | 只看该作者
sjnh 发表于 2015-12-20 10:18
你把USART_IT_TXE 中断关了;
你打开了TXE中断,但却用了查询发送,中断里又没有关TXE中断,所以这个中断一 ...

//        USART_ITConfig(USART2, USART_IT_TXE , DISABLE);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART2, ENABLE);
将USART_IT_TXE 中断关了,只保留接收中断
你说我打开了TXE中断,是指?

使用特权

评论回复
11
feihufuture|  楼主 | 2015-12-20 10:37 | 只看该作者
yklstudent 发表于 2015-12-20 10:01
身边没有STM32F1系列的板子,所以没法实际DEBUG调试;
你跟别人的范例对比下查找问题 ...

对了,给一个人帮我改,他居然说是我复用时钟没使能!
我分析了下,不可能是这个问题,因为串口2是IO口的默认复用功能,不是重映射来的,所以不用打开复用时钟!
我按照他说的试了一下,没啥进步!

使用特权

评论回复
12
feihufuture|  楼主 | 2015-12-20 10:43 | 只看该作者
sjnh 发表于 2015-12-20 10:18
你把USART_IT_TXE 中断关了;
你打开了TXE中断,但却用了查询发送,中断里又没有关TXE中断,所以这个中断一 ...

还有,我这么测试过,在别人的工程中,将断点放在接收中断标志处,全速运行时可以到达;
但是我的不行,也就是放在我代码的
                if(RS232_REC_Flag == 1)//RS232½ÓÊÕµ½ÁËÊý¾Ý
                {
                       
                RS232_REC_Flag = 0;
这里

使用特权

评论回复
13
huangqi412| | 2015-12-20 10:49 | 只看该作者
哈 这倒是算悬赏贴

使用特权

评论回复
14
feihufuture|  楼主 | 2015-12-20 10:58 | 只看该作者
huangqi412 发表于 2015-12-20 10:49
哈 这倒是算悬赏贴

那你还不赶紧上,分分钟100元到手,O(∩_∩)O哈哈~

使用特权

评论回复
15
gcxzhz| | 2015-12-20 12:51 | 只看该作者
你没有配置NVICZ中断

使用特权

评论回复
16
huangqi412| | 2015-12-20 12:58 | 只看该作者
feihufuture 发表于 2015-12-20 10:58
那你还不赶紧上,分分钟100元到手,O(∩_∩)O哈哈~

还是嗑瓜子看别人拿奖吧

使用特权

评论回复
17
feihufuture|  楼主 | 2015-12-20 13:10 | 只看该作者
gcxzhz 发表于 2015-12-20 12:51
你没有配置NVICZ中断

加入如下中断优先级配置,也不行
void Init_NVIC(void)
{

          NVIC_InitTypeDef NVIC_InitStructure;                        //¶¨ÒåÒ»¸öNVICÏòÁ¿±í½á¹¹Ìå±äÁ¿
/*
        #ifdef  VECT_TAB_RAM                                                          //ÏòÁ¿±í»ùµØÖ·Ñ¡Ôñ

          NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);          //½«0x20000000µØÖ·×÷ΪÏòÁ¿±í»ùµØÖ·(RAM)
        #else  

          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //½«0x08000000µØÖ·×÷ΪÏòÁ¿±í»ùµØÖ·(FLASH)  
        #endif
*/
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        //ÉèÖÃÖжÏ×é Ϊ2

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                        //ÅäÖô®¿Ú1ΪÖжÏÔ´
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;         //ÉèÖÃÕ¼ÏÈÓÅÏȼ¶Îª2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                          //ÉèÖø±ÓÅÏȼ¶Îª0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                  //ʹÄÜ´®¿Ú1ÖжÏ
        NVIC_Init(&NVIC_InitStructure);                                                                  //¸ù¾Ý²ÎÊý³õʼ»¯ÖжϼĴæÆ÷
}

使用特权

评论回复
18
xujihu| | 2015-12-20 14:51 | 只看该作者
1、初始化配置不能使能发送中断;//USART_ITConfig(USART2, USART_IT_TXE , ENABLE);
2、加入中断优先级。

main.zip

1.59 KB

使用特权

评论回复
19
gcxzhz| | 2015-12-20 14:56 | 只看该作者
本帖最后由 gcxzhz 于 2015-12-20 15:24 编辑
feihufuture 发表于 2015-12-20 13:10
加入如下中断优先级配置,也不行
void Init_NVIC(void)
{

试一下吧,我再按你的格式要求改改
先看看能能不再你的板子上运行
我用原子的mini板子没有问题
可以的话我改完了把工程发给你

HW_WIFI.rar

2.34 KB

使用特权

评论回复
20
feihufuture|  楼主 | 2015-12-20 15:19 | 只看该作者
xujihu 发表于 2015-12-20 14:51
1、初始化配置不能使能发送中断;//USART_ITConfig(USART2, USART_IT_TXE , ENABLE);
2、加入中断优先级。 ...

不能成功,再次感谢,我再买个其他的开发板试试

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1027

帖子

101

粉丝