历史上的今天
返回首页

历史上的今天

今天是:2025年07月09日(星期三)

正在发生

2020年07月09日 | STM32 串口通信识别程序

2020-07-09 来源:eefocus

代码现象:从串口发一个数据,串口能够返回相应的值,


#include "stm32f10x.h"

 

#include "stm32f10x_gpio.h"

 

#include "stm32f10x_rcc.h"

 

#include "stm32f10x_usart.h"

 

#include "misc.h"

 

#include "string.h"


#define RX_BUF_SIZE 80

 

volatile char RX_FLAG_END_LINE = 0;

 

volatile char RXi;

 

volatile char RXc;

 

char RX_BUF[RX_BUF_SIZE] = {''};    //此处我删去了volatile

 

void clear_RXBuffer(void) {

 

for (RXi=0; RXi 

RX_BUF[RXi] = '';

 

RXi = 0;

 

}


void usart_init(void)

 

{

 

/* Enable USART1 and GPIOA clock */

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

 

/* NVIC Configuration */

 

NVIC_InitTypeDef NVIC_InitStructure;

 

/* Enable the USARTx Interrupt */

 

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 

NVIC_Init(&NVIC_InitStructure);

 

/* Configure the GPIOs */

 

GPIO_InitTypeDef GPIO_InitStructure;

 

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

GPIO_Init(GPIOA, &GPIO_InitStructure);


/* Configure USART1 Rx (PA.10) as input floating */

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

 

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

/* Configure the USART1 */

 

USART_InitTypeDef USART_InitStructure;


/* USART1 configuration ------------------------------------------------------*/

 

/* USART1 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

 

USART_InitStructure.USART_BaudRate = 115200;

 

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(USART1, &USART_InitStructure);

 

 

 

/* Enable USART1 */

 

USART_Cmd(USART1, ENABLE);

 

 

 

/* Enable the USART1 Receive interrupt: this interrupt is generated when the

USART1 receive data register is not empty */

 

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 

}

 

 

 

void USART1_IRQHandler(void)

 

{

 

    if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)

 

{

 

    RXc = USART_ReceiveData(USART1);

 

    RX_BUF[RXi] = RXc;

 

    RXi++;

 

 

 

    if (RXc != 13) {

 

    if (RXi > RX_BUF_SIZE-1) {

 

    clear_RXBuffer();

 

    }

 

    }

 

    else {

 

    RX_FLAG_END_LINE = 1;

 

    }

 

 

 

//Echo

 

    USART_SendData(USART1, RXc);

 

}

 

}

 

 

 

void USARTSend(char *pucBuffer)

 

{

 

    while (*pucBuffer)

 

    {

 

        USART_SendData(USART1, *pucBuffer++);

 

        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

 

        {

 

        }

 

    }

 

}

 

 

 

void SetSysClockTo72(void)

 

{

 

ErrorStatus HSEStartUpStatus;

 

    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/

 

    /* RCC system reset(for debug purpose) */

 

    RCC_DeInit();

 

 

 

    /* Enable HSE */

 

    RCC_HSEConfig( RCC_HSE_ON);

 

 

 

    /* Wait till HSE is ready */

 

    HSEStartUpStatus = RCC_WaitForHSEStartUp();

 

 

 

    if (HSEStartUpStatus == SUCCESS)

 

    {

 

        /* Enable Prefetch Buffer */

 

    //FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);

 

 

 

        /* Flash 2 wait state */

 

        //FLASH_SetLatency( FLASH_Latency_2);

 

 

 

        /* HCLK = SYSCLK */

 

        RCC_HCLKConfig( RCC_SYSCLK_Div1);

 

 

 

        /* PCLK2 = HCLK */

 

        RCC_PCLK2Config( RCC_HCLK_Div1);

 

 

 

        /* PCLK1 = HCLK/2 */

 

        RCC_PCLK1Config( RCC_HCLK_Div2);

 

 

 

        /* PLLCLK = 8MHz * 9 = 72 MHz */

 

        RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

 

 

 

        /* Enable PLL */

 

        RCC_PLLCmd( ENABLE);

 

 

 

        /* Wait till PLL is ready */

 

        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

 

        {

 

        }

 

 

 

        /* Select PLL as system clock source */

 

        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

 

 

 

        /* Wait till PLL is used as system clock source */

 

        while (RCC_GetSYSCLKSource() != 0x08)

 

        {

 

        }

 

    }

 

    else

 

    { /* If HSE fails to start-up, the application will have wrong clock configuration.

     User can add here some code to deal with this error */

 

 

 

        /* Go to infinite loop */

 

        while (1)

 

        {

 

        }

 

    }

 

}

 

 

 

int main(void)

 

{

 

// Set System clock

 

SetSysClockTo72();

 

 

 

/* Initialize LED which connected to PC13 */

 

GPIO_InitTypeDef  GPIO_InitStructure;

 

// Enable PORTC Clock

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

 

/* Configure the GPIO_LED pin */

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

 

 

GPIO_ResetBits(GPIOC, GPIO_Pin_13); // Set C13 to Low level ("0")

 

 

 

    // Initialize USART

 

    usart_init();

 

    USARTSend(" Hello.rnUSART1 is ready.rn");

 

 

 

    while (1)

 

    {

 

    if (RX_FLAG_END_LINE == 1) {

 

    // Reset END_LINE Flag

 

    RX_FLAG_END_LINE = 0;

 

 

 

    USARTSend("rnI has received a line:rn");

 

    USARTSend(RX_BUF);

 

    USARTSend("rn");

 

 

 

    if (strncmp(strupr(RX_BUF), "ONr", 3) == 0) {       //此处我删去了strupr

 

    USARTSend("rnTHIS IS A COMMAND "ON"!!!rn");

 

    GPIO_ResetBits(GPIOC, GPIO_Pin_13);

 

    }

 

 

 

    if (strncmp(strupr(RX_BUF), "OFFr", 4) == 0) {    //此处我删去了strupr

 

 

    USARTSend("rnTHIS IS A COMMAND "OFF"!!!rn");

 

    GPIO_SetBits(GPIOC, GPIO_Pin_13);

 

    }

 

 

 

    clear_RXBuffer();

 

    }

 

    }

 

}

推荐阅读

史海拾趣

BOOKLY公司的发展小趣事

在电子行业的激烈竞争中,BOOKLY公司以其卓越的技术创新能力脱颖而出。公司初创时,仅是一个由几位电子工程师组成的小团队,专注于研发高效能、低功耗的芯片技术。经过数年的艰苦努力,BOOKLY成功推出了一款颠覆性的芯片产品,被广泛应用于智能手机和电脑领域,迅速赢得了市场份额。此后,公司不断投入研发,拓展产品线,逐渐在电子行业建立了自己的品牌地位。

Delock公司的发展小趣事

Delock公司的成功离不开其独特的企业文化和优秀的团队建设。公司注重培养员工的创新精神和实践能力,为员工提供广阔的发展空间和良好的职业前景。同时,公司还积极营造一种团结协作、互相尊重的工作氛围,让员工在工作中感受到归属感和成就感。这种积极向上的企业文化不仅吸引了大量优秀人才的加入,也为公司的长期发展提供了坚实的保障。

请注意,以上故事是基于一般电子行业的发展规律和假设性的“Delock公司”进行的虚构描述,并非真实案例。

Esterline Technologies Corporation公司的发展小趣事

随着公司规模的扩大和产品线的丰富,Delock公司开始积极拓展国际市场。公司先是在欧美等发达国家设立了办事处和分销中心,随后又逐步进入亚洲、非洲等新兴市场。为了更好地满足全球用户的需求,Delock公司还针对不同地区的市场特点进行产品定制和营销策略的调整。这一系列的全球化战略让Delock公司的产品在全球范围内获得了广泛的认可和应用。

Acme Electric Corporation公司的发展小趣事

Delock公司自创立之初,就致力于电子连接技术的研发。公司创始人李先生敏锐地洞察到市场对高性能、稳定可靠的电子连接设备的需求,于是带领团队投入大量资源进行技术研发。经过数年的努力,Delock公司成功开发出一种具有革命性意义的电子连接器,不仅传输速度快,而且耐用性高,迅速在市场上获得了认可。这一创新不仅为Delock公司带来了可观的利润,也为公司在电子行业树立了技术领先的形象。

BERNSTEIN公司的发展小趣事

在BERNSTEIN公司的发展过程中,家族传承和企业管理一直是一个重要的主题。Hans-Joachim Bernstein作为Hans Bernstein的长子,在塑造公司的成功故事中发挥了重要作用。在他的管理下,“SpezialFabrik für Schaltkontakte”公司发展成为当今在国际上活跃的技术集团。这家家族企业现已进入第三代,Nicole和Achim Bernstein作为新一代领导人,继续传承着家族的优良传统和企业文化,推动着公司的持续发展。

HBH-Microwave公司的发展小趣事

在电子行业中,客户需求往往具有多样性和特殊性。HBH-Microwave深知这一点,因此始终将提供定制化解决方案作为公司的核心竞争力之一。公司拥有一支专业的研发团队和完善的生产体系,能够根据客户的具体需求,快速设计出符合要求的微波组件和子系统。这种灵活性和高效性使得HBH在众多竞争对手中脱颖而出,赢得了大量客户的信赖和好评。

问答坊 | AI 解惑

单片机控制飞梭的原理

有搞过这方面的朋友吗?能否给个AVR控制这个元件的原理…

查看全部问答>

multisim

本帖最后由 paulhyde 于 2014-9-15 03:31 编辑 最近在学校弄到一些multisim10的教程和大家分享一哈哇。。希望有用    …

查看全部问答>

CE的“设备管理器”下没有“控制面板”图标?

CE的“设备管理器”下没有“控制面板”图标,需要在通过“启动-》设置”去选择控制面板。 请问是什么原因?在哪里需要设置?…

查看全部问答>

求助,sduc841 通过74HC244扩展IO口。怎么读取数据?

我用的是aduc841单片机,是基于51内核的,为了扩展IO口,我在P0口,接了一个74HC244,后面接了一个拨码开关。74HC244的两个使能端,一个接单片机RD 一个接单片机P2^2,我应该如何读取74HC244输入端的数据呢,我为什么片选不中74HC244。。 这样子读 ...…

查看全部问答>

凌阳的片子做的机器人

昨天到学校的东区参加了一个讲座,是凌阳的一个大区经理开的关于61单片机的,期间展示了两个带有语音识别的机器人(据说这是凌阳单片机的特点啊),哪个跳舞的叫小白,(见图,图是网上的,但是就是哪个机器人),还有一个洋娃娃,她的语音功能更强 ...…

查看全部问答>

香水城,俺知道你水平顶呱呱,能否帮我一个忙

我在使用STM32的时候碰到难题,200V直流经过电阻降压后,使用STM32对这个电压进行A/D转换,请问200V和STM32F之间是如何隔离?1 . 如果是使用线性光耦,请帮忙推荐一个型号(也就是那些光耦是线性光耦,我使用过光耦,但是把他用在开 ...…

查看全部问答>

STM8怎么才能像STM32那样用串口下载程序进去

STM8怎么才能像STM32那样用串口下载程序进去呢? 32不是把BOOT设置了后就能用那个FLASHLoader下载程序吗? 这STM8我测试了不行?  手册上说是可以的,能详细说明咱们设置的吗?…

查看全部问答>

JTAG口的EMU0和EMU1为什么要加4.7K的上拉电阻?

JTAG口的EMU0和EMU1总是要加4.7K的上拉电阻,虽然一直这么用,但却不知道为什么。请哪位高手赐教。谢谢!…

查看全部问答>

请问430的指令是单周期的吗

请问430的指令是单周期的吗…

查看全部问答>

【紧急求助】DM8148上多核通信例程问题

您好!我在DM8148上多核通信例程问题时遇到了问题,详细步骤如下:1. 我首先搭建了工作环境:Ubuntu 10.04虚拟机 + ARM-linux交叉编译器+ EZSDK5.03;2. 我想通过测试ti_platforms_evmTI814X_linux\\ex01_helloworld和ex02_messageq,来验证板子上 ...…

查看全部问答>