【二】STM32F4 USART1 中断方式接收再将字符打印出来
2013-12-10 20:51
316 查看
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* USART1 GPIO config
*/
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
/* USART1 mode config
*/
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);
/*使能中断*/
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1, ENABLE);
}
还需要配置NVIC
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
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);
}
在以上函数中,NVIC_IRQChannel 是中断源,可以到STM32F4XX.H的140行处找,
第二项Preemption是中断组,中断组之间可以嵌套,0代表最高。
第三项是每个中断组里的中断成员,成员之间区分优先级,但一个组里的不可以嵌套。
第四项代表使能中断。
好了,NVIC配置好了后,就可以在stm32f4xx_it里添加中断服务函数了。
void USART1_IRQHandler(void)
{
char c;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
c = USART_ReceiveData(USART1);
USART_SendData(USART1,c);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
}
}
中断服务函数工作很简单,就是将接收到的数据再通过SendData发送出去。
同时为了便于观察是否进入中断,添加了取反GPIOD14的操作,对应discovery板子上的红色LED。
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* USART1 GPIO config
*/
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_50MHz;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
/* USART1 mode config
*/
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);
/*使能中断*/
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1, ENABLE);
}
还需要配置NVIC
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
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);
}
在以上函数中,NVIC_IRQChannel 是中断源,可以到STM32F4XX.H的140行处找,
第二项Preemption是中断组,中断组之间可以嵌套,0代表最高。
第三项是每个中断组里的中断成员,成员之间区分优先级,但一个组里的不可以嵌套。
第四项代表使能中断。
好了,NVIC配置好了后,就可以在stm32f4xx_it里添加中断服务函数了。
void USART1_IRQHandler(void)
{
char c;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
c = USART_ReceiveData(USART1);
USART_SendData(USART1,c);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
GPIO_ToggleBits(GPIOD,GPIO_Pin_14);
}
}
中断服务函数工作很简单,就是将接收到的数据再通过SendData发送出去。
同时为了便于观察是否进入中断,添加了取反GPIOD14的操作,对应discovery板子上的红色LED。
相关文章推荐
- C语言写函数实现接收n个字符串,将以某个字符为开头的字符串打印出来。
- C语言_利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 【程序27】利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
- 3.字符反转 输入一串字符,比如"abcd",以倒序的方式将它打印出来
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 编写一个程序,要求接收一个数字,程序会将这个数字以二进制方式打印,例如:数字10 , 以1010的方式打印出来
- STM32F429(HAL库)_USART串口发送&接收(使用STM32CubeMX)
- arduino将从串口接收到的数据打印出来
- 要求接收一个数字,程序会将这个数字以二进制方式打印
- 将N进制数以字符打印出来
- STM8S003F使用IO口模拟串口(三)使用中断方式发送和接收数据
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- STM32 -USART中断方式
- 输入十个字符,存放到数组中,然后顺序打印出来。C语言新手
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。C++
- 32的 USART1 用 DMA 方式发送与接收 转