stm32 的烧录及串口程序问题

skevil 2013-11-14 06:07:21
首先,stm32分了ram和flash烧录程序,我刚入手,不知道到底我现在是烧录到ran中还是flash中,然后不使用调试方式的时候程序是不是要烧到flash中去?
另外我用了3.5的固件库来写串口程序,调试了很多天都没办法实现发送,接收,不知道哪里有出错,我检查了很久的。求大神指导啦!
以下是我串口的代码
void USART_CFG(void)
{
USART_InitTypeDef USART_InitStruct;
USART_ClockInitTypeDef USART_ClockInitStruct;
USART_ClockInitStruct.USART_Clock =USART_Clock_Disable;
USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1,&USART_ClockInitStruct);


USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No ; //奇偶校验
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制模式使能还是失能(即使用RTS/CTS(请求发送/清除发送)流控制)
USART_Init(USART1, &USART_InitStruct);

USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
GPIO_SetBits(GPIOF, GPIO_Pin_6);
//USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);
// USART_ClearFlag(USART1,USART_FLAG_TC);
//USART_Cmd(USART1,ENABLE);

}

void RCC_CFG(void)
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOF, ENABLE);


}

void GPIO_CFG(void)
{

GPIO_InitTypeDef GPIO_InitStruct;
//TX
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//RX
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStruct);


}

void NVIC_CFG(void)
{

NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

}

int main(void)
{
RCC_CFG();

GPIO_CFG();

NVIC_CFG();

USART_CFG();

USART_Cmd(USART1,ENABLE);
GPIO_SetBits(GPIOF, GPIO_Pin_7);
//GPIO_SetBits(GPIOF, GPIO_Pin_8);
while(1)
{

USART_SendData(USART1, 0x11);
GPIO_SetBits(GPIOF, GPIO_Pin_8);


}

}

...全文
811 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
skevil 2013-11-17
  • 打赏
  • 举报
回复
引用 23 楼 zhxianbin 的回复:
另外你觉得你的接收中断都已经设置正确了,应该进入中断,前提是收到数据了,所以至少你还要确定连接有没有问题,比如串口线
连接线应该是没问题的,因为我用不进入中断的方式收发都可以完成了,就是不能用中断的方式接收数据
zhxianbin 2013-11-16
  • 打赏
  • 举报
回复
另外你觉得你的接收中断都已经设置正确了,应该进入中断,前提是收到数据了,所以至少你还要确定连接有没有问题,比如串口线
zhxianbin 2013-11-16
  • 打赏
  • 举报
回复
引用 21 楼 skevil 的回复:
[quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
它是一直都不进入中断,可是我中断已经是设置对的了啊 [/quote] 有问题就说明你还有错误,只是你暂时还没发现,老是抱着‘自己都已经正确了’那是解决不了问题的,要改变这种思想。
zhxianbin 2013-11-15
  • 打赏
  • 举报
回复
引用 19 楼 skevil 的回复:
[quote=引用 18 楼 zhxianbin 的回复:] [quote=引用 17 楼 skevil 的回复:] [quote=引用 16 楼 zhxianbin 的回复:] [quote=引用 15 楼 skevil 的回复:] [quote=引用 14 楼 zhxianbin 的回复:] [quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了[/quote] 还需要配置 nvic[/quote] void NVIC_CFG(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } 设置了啊[/quote] void USART1_IRQHandler( void ) 函数名不能错[/quote] 也是没错的啊[/quote] 那确定一下有没有收到吧
skevil 2013-11-15
  • 打赏
  • 举报
回复
引用 18 楼 zhxianbin 的回复:
[quote=引用 17 楼 skevil 的回复:] [quote=引用 16 楼 zhxianbin 的回复:] [quote=引用 15 楼 skevil 的回复:] [quote=引用 14 楼 zhxianbin 的回复:] [quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了[/quote] 还需要配置 nvic[/quote] void NVIC_CFG(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } 设置了啊[/quote] void USART1_IRQHandler( void ) 函数名不能错[/quote] 也是没错的啊
zhxianbin 2013-11-15
  • 打赏
  • 举报
回复
引用 17 楼 skevil 的回复:
[quote=引用 16 楼 zhxianbin 的回复:] [quote=引用 15 楼 skevil 的回复:] [quote=引用 14 楼 zhxianbin 的回复:] [quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了[/quote] 还需要配置 nvic[/quote] void NVIC_CFG(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } 设置了啊[/quote] void USART1_IRQHandler( void ) 函数名不能错
skevil 2013-11-15
  • 打赏
  • 举报
回复
引用 10 楼 zhxianbin 的回复:
USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
它是一直都不进入中断,可是我中断已经是设置对的了啊
skevil 2013-11-15
  • 打赏
  • 举报
回复
引用 16 楼 zhxianbin 的回复:
[quote=引用 15 楼 skevil 的回复:] [quote=引用 14 楼 zhxianbin 的回复:] [quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了[/quote] 还需要配置 nvic[/quote] void NVIC_CFG(void) { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } 设置了啊
zhxianbin 2013-11-15
  • 打赏
  • 举报
回复
引用 15 楼 skevil 的回复:
[quote=引用 14 楼 zhxianbin 的回复:] [quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了[/quote] 还需要配置 nvic
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 14 楼 zhxianbin 的回复:
[quote=引用 12 楼 skevil 的回复:] [quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。[/quote] 我想接收时产生中断的,但是我发现没办法进入中断啊, 加入的是这一句USART_ITConfig(USART1,USART_IT_RXNE ,ENABLE); 但是没办法进入中断,太蛋疼了
zhxianbin 2013-11-14
  • 打赏
  • 举报
回复
引用 12 楼 skevil 的回复:
[quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?[/quote]这个中断具体什么意思没仔细看过,你需要在中断中做点什么时才打开,否则没必要。
zhxianbin 2013-11-14
  • 打赏
  • 举报
回复
引用 11 楼 skevil 的回复:
[quote=引用 10 楼 zhxianbin 的回复:] USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
在MDK上是不是点这个就是下载到flash中的?那就不用再操作J-Flash ARM了吗?[/quote] 是的,不需要操作 jflash,但是mdk要设置,默认不是使用 jlink。
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 10 楼 zhxianbin 的回复:
USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
我看了一下固件库使用手册,USART_IT_TXE说是发送中断,那是指我发送完成后产生一次中断的意思吧?
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 10 楼 zhxianbin 的回复:
USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了

在MDK上是不是点这个就是下载到flash中的?那就不用再操作J-Flash ARM了吗?
zhxianbin 2013-11-14
  • 打赏
  • 举报
回复
USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这是 发送不为空的中断,开了发送时就不停中断了
zhxianbin 2013-11-14
  • 打赏
  • 举报
回复
引用 8 楼 skevil 的回复:
[quote=引用 7 楼 zhxianbin 的回复:] 从ram启动还是flash启动要设置引脚的,看手册; J-Link可以烧到flash中,直接从 mdk 操作就行; 单步调试,不需要看 led
不是,因为我笔记本的USB口不够用,很麻烦所以用led的老方法,然后我发现一个问题,就是当我不开启USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这个中断时就可以发送,我用中断的方式就不能发送了,这是什么情况[/quote] 发送不需要中断,另外既然调试总得保证一个 usb的,复杂点的 led没法调了
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 7 楼 zhxianbin 的回复:
从ram启动还是flash启动要设置引脚的,看手册; J-Link可以烧到flash中,直接从 mdk 操作就行; 单步调试,不需要看 led
不是,因为我笔记本的USB口不够用,很麻烦所以用led的老方法,然后我发现一个问题,就是当我不开启USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 这个中断时就可以发送,我用中断的方式就不能发送了,这是什么情况
zhxianbin 2013-11-14
  • 打赏
  • 举报
回复
从ram启动还是flash启动要设置引脚的,看手册; J-Link可以烧到flash中,直接从 mdk 操作就行; 单步调试,不需要看 led
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 3 楼 zhxianbin 的回复:
从 ram启动还是从 flash 启动是通过 boot0、boot1来选择的,看看手册。 不调试时肯定要烧到flash,ram是无法保存数据的
使用J-Link跟MDK调试的话烧到ram中应该如何设置,J-Link可以烧到flash中吗? 具体怎么操作呢?现在我弄得有点晕
skevil 2013-11-14
  • 打赏
  • 举报
回复
引用 4 楼 zhxianbin 的回复:
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

	/* Configure USART1 Tx (PA9) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART1 Rx (PA10) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* USART1 configured as follow:
        - BaudRate = 38400 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
    */
    USART_InitStructure.USART_BaudRate = 38400;
    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_Tx;

    /* Configure USART1 */
    USART_Init(USART1, &USART_InitStructure);

    /* Enable USART1 Receive and Transmit interrupts */
    //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    /* Enable the USART1 */
    USART_Cmd(USART1, ENABLE);
现在是直接就不运行了,我是通过看LED的方式查看的,是不是烧录的初始地址有问题呃?
加载更多回复(4)

27,372

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧