luokanx 发表于 2016-12-29 11:43:48

andypanfan 发表于 2016-12-29 09:11
你这个代码哎

重新整理了一下,在9楼,10楼有进一步的描述,麻烦帮我看一下呗。

endsoing 发表于 2016-12-29 12:06:25

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
抢占优先级设为最高级是否合适,高低一些试试。

any012 发表于 2016-12-29 12:29:42

确定单片机是否工作?比如用IO口先控制个LED亮灭。

晕了,我也是瞎说,既然能下载程序,那么单片机应该是正常工作的...

luokanx 发表于 2016-12-29 13:45:49

程序没有错,是硬件连接上的问题。能用了。

luokanx 发表于 2016-12-29 14:48:52

原来是在GPIO Config()里面没有开启总线时钟,里面加上这句就可以了。
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

damiaa 发表于 2016-12-29 15:14:21

:):):):):):)

zbber 发表于 2016-12-29 16:13:55

重新整理了一下

andypanfan 发表于 2016-12-30 09:05:26

#ifndef __USART3_H
#define __USART3_H

#include "sys.h"
#include "delay.h"
#include "string.h"
#include <stdlib.h>
#include "time3.h"

#defineTX3_buf_size        30
#defineRX3_buf_size        30

extern u8 USART3_RX_CNT;

extern u8 USART3_RX_BUF;
extern u8 USART3_TX_BUF;

void usart3_init(u32 bound);
void usart3_Send_Data(u8 *buf,u8 len);
void clear_usart3_receive_buf(void);

#endif


#include "usart3.h"

//#if 1
//#pragma import(__use_no_semihosting)                              
//struct __FILE
//{
//        int handle;

//};

//FILE __stdout;         
//_sys_exit(int x)
//{
//        x = x;
//}
//int fputc(int ch, FILE *f)
//{      
//        while((USART3->SR&0X40)==0);
//    USART3->DR = (u8) ch;      
//        return ch;
//}
//#endif

u8 usart3_receive_data_flag=0;                                                                                                         
u8 USART3_RX_CNT=0;                                                                                                                                     

u8 USART3_RX_BUF={0};                                                                                                  
u8 USART3_TX_BUF={0};                                                                                                  

void usart3_init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);                                                       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);

        USART_DeInit(USART3);
   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                                                                 //USART3_TX   PB10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                                        //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                                                                //USART3_RX          PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                                                        //浮空输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;                                                                //Usart3 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;                                                //抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                                                                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);
        USART_InitStructure.USART_BaudRate = bound;                                                                                //一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                //字长为8位数据格式
        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(USART3, &USART_InitStructure);                                                                                 //初始化串口
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                                                                        //开启中断
    USART_Cmd(USART3, ENABLE);
}

void USART3_IRQHandler(void)                                                                                                //串口1中断服务程序
{
        unsigned char usart3_rece_dat=0;
   
        if(USART_GetITStatus(USART3, USART_IT_RXNE)==SET)                                                           //接收中断
        {
          usart3_rece_dat=USART_ReceiveData(USART3);
                if(USART3_RX_CNT<sizeof(USART3_RX_BUF))                                                                    //最多接收30个字节的数据
                {
                        USART3_RX_BUF=usart3_rece_dat;                                                        //记录接收到的值
                        USART3_RX_CNT++;                                                                                                                //接收数据增加1
                }                                                                                                                                        //USART_ReceiveData(USART1);
   }
}

void usart3_Send_Data(u8 *buf,u8 len)
{                                                                                               
    u8 t;
        for(t=0;t<len;t++)                                                                                                                                //循环发送数据
        {                  
                while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);          
                USART_SendData(USART3,buf);
        }       
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);                          
}

void clear_usart3_receive_buf(void)
{
        memset(USART3_RX_BUF,0,sizeof(USART3_RX_BUF));
        USART3_RX_CNT=0;
}

这是我以前测试过的代码你看看!!!

rowen800 发表于 2016-12-30 16:57:50

检测串口打印那块的配置
页: 1 [2]
查看完整版本: F103求助USART3无法工作,MDK仿真能够输出,但板子不能打印