本帖最后由 lsy3500 于 2017-1-10 15:33 编辑
如题,看原子哥的视频,用原子哥的代码,但是我调试就一直是乱码,不知道怎么回事,求助。附上我的代码和压缩包(其实主要还是原子哥的代码
)~~~
附件是我的代码压缩包,恳请大大们帮我看看,谢谢。
程序结构:
main(){
接收字符串:依靠中断接收字符并转发出来
while(1){
循环发送字符串:lsy
}
}
[mw_shl_code=c,true]#include "stm32f10x.h"
//延时函数
void mydelay_ms(int ms) {
volatile int i;
int k = ms * 2333 ;
for ( i=0; i<k; i++ ) {
;
}
}
//初始化函数
void LSY_USART1_Init(void)
{
//三个相关结构体
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//配置引脚(usart1)
//GPIOA_Pin_9
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
//GPIOA_Pin_10
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
//串口参数配置
USART_InitStrue.USART_BaudRate=9600;
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStrue);//串口初始化
USART_Cmd(USART1,ENABLE);//使能串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
//中断参数配置
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStrue);
}
//中断处理函数:功能:转发接收到的字符串
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res= USART_ReceiveData(USART1);
USART_SendData(USART1,res);
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级配置
LSY_USART1_Init();//调用初始化函数
while(1){
char buf[] = {"lsy"};
char i = 0;
USART_GetFlagStatus(USART1, USART_FLAG_TC);//解决串口发送首字母丢失的问题
for (i=0; i<3; i++) {
USART_SendData(USART1, buf
);
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
}
USART_SendData(USART1, 0x0A); //"
"
mydelay_ms(3000);
}
}
[/mw_shl_code]
这里有两个物理过程,收和发,
要一个个调试,别指望一次全搞定,高手也未必行。
在中断函数里设断点,收一个字节就应当停在断点处,
然后检查接收数据是否等于发送方的数据。
正确则说明接收功能基本正常。再往后面查。
之前学习寄存器版本,现在用库函数感觉很方便....
下面代码能实现,感觉中断转发不怎么可靠...楼主可以自己试一下多中断或多任务的情况下
[mw_shl_code=applescript,true]int main(void) {
uint32_t del;
GPIO_InitTypeDef uGPIO;
USART_InitTypeDef uUSART;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
uGPIO.GPIO_Pin = GPIO_Pin_9;
uGPIO.GPIO_Mode = GPIO_Mode_AF_PP;
uGPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &uGPIO);
uGPIO.GPIO_Pin = GPIO_Pin_10;
uGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
uGPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &uGPIO);
USART_DeInit(USART1);
/* USART_InitStruct members default value */
uUSART.USART_BaudRate = 9600;
uUSART.USART_WordLength = USART_WordLength_8b;
uUSART.USART_StopBits = USART_StopBits_1;
uUSART.USART_Parity = USART_Parity_No ;
uUSART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
uUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &uUSART);
NVIC_SetPriorityGrouping(2);
NVIC_SetPendingIRQ(USART1_IRQn);
NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriority(USART1_IRQn, 2);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
while(1) {
del = 1000000;
while(del--) {;}
}
}
void USART1_IRQHandler(void) {
uint8_t Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
Res = USART_ReceiveData(USART1);
USART1->DR = Res;
//while((USART1->SR&0X40)==0);
USART_ClearFlag(USART1, USART_FLAG_RXNE);
}
}[/mw_shl_code]
哦哦 ,明白了,我试试。
乱码,寄存器我还是不太会,比较菜,我先调试下我的程序,昨天找到原因是硬件的RXD跟TXD焊接反了,现在换过来我的程序基本对了,就出了一点小问题,发送的时候只能发送前两个字节,我先单步调试下,找找原因。完了再研究下寄存器。
灰常感谢哈。
一周热门 更多>