STM32 定时器2+串口

发布者:国宝集团最新更新时间:2016-06-15 来源: eefocus关键字:STM32  定时器2  串口 手机看文章 扫描二维码
随时随地手机看文章
定时器2+串口发送
USART.c

#include "STM32Lib\\stm32f10x.h"
/**********************************************
**串口配置函数,这里使能了两个串口,其中串口2使用了中断接收模式
**
**********************************************/
u8 Uart1_Get_Flag; //串口1接收到数据标志
u8 Uart1_Get_Data; //串口1接收的数据

void USART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;

//使能串口1,PA,AFIO总线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_USART1 ,
ENABLE);

/* A9 USART1_Tx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* A10 USART1_Rx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX
GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_InitStructure.USART_BaudRate = 9600;
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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE);
//串口1使用接收中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

//使能串口2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

// A2 做T2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// A3 做R2X
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_InitStructure.USART_BaudRate = 9600;
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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

USART_ClockInit(USART2, &USART_ClockInitStructure);
USART_Init(USART2, &USART_InitStructure);

USART_Cmd(USART2, ENABLE);
//串口2使用接收中断
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}

void USART1_Putc(unsigned char c)
{
USART_SendData(USART1, c);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}

void USART1_Puts(char * str)
{
while(*str)
{
USART_SendData(USART1, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}

void USART2_Putc(unsigned char c)
{
USART_SendData(USART2, c);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
}

void USART2_Puts(char * str)
{
while(*str)
{
USART_SendData(USART2, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}

}

hal.h

#ifndef HAL_H
#define HAL_H

//硬件初始化
extern void ChipHalInit(void);
extern void ChipOutHalInit(void);

//输出宏定义
//清零
#define LED1_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_8)
//置一
#define LED1_ON GPIO_SetBits(GPIOA, GPIO_Pin_8)

#define LED2_OFF GPIO_ResetBits(GPIOA, GPIO_Pin_7)
#define LED2_ON GPIO_SetBits(GPIOA, GPIO_Pin_7)

#define LED3_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_7)
#define LED3_ON GPIO_SetBits(GPIOC, GPIO_Pin_7)

#define LED4_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_5)
#define LED4_ON GPIO_SetBits(GPIOC, GPIO_Pin_5)

#define LED5_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define LED5_ON GPIO_SetBits(GPIOB, GPIO_Pin_9)

#define LED6_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define LED6_ON GPIO_SetBits(GPIOB, GPIO_Pin_8)

#define LED7_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define LED7_ON GPIO_SetBits(GPIOB, GPIO_Pin_5)

#define LED8_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define LED8_ON GPIO_SetBits(GPIOB, GPIO_Pin_0)

//串口
extern void USART1_Putc(u8 c);
extern void USART1_Puts(char * str);
extern void USART2_Putc(u8 c);
extern void USART2_Puts(char * str);

extern u8 flag;
extern u32 count;
extern u8 Uart1_Get_Flag;
extern u8 Uart1_Get_Data;

#endif

TIM.c

#include "STM32Lib\\stm32f10x.h"

void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = 4000;//捕获比较值1
u16 CCR2_Val = 2000;//捕获比较值2
u16 CCR3_Val = 1000;//捕获比较值3
u16 CCR4_Val = 500; //捕获比较值4

/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 8000; //计数值 
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //预分频,此值+1为分频的除数,分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
//向上计数,从0计数到自动加载值,然后重新从0开始计数,并产生一个计数溢出事件
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/* 比较通道1*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //输出比较非主动模式
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为正

TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); //禁止OC1重装载,其实可以省掉这句,因为默认是4路都不重装的.

/*比较通道2 */ 
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

/* 比较通道3 */ 
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

/* 比较通道4 */ 
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);

/*使能预装载*/
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

/* 4个通道和溢出都配置中断*/
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);

/* 允许TIM2开始计数 */
TIM_Cmd(TIM2, ENABLE);
}

NVIC.c

#include "STM32Lib\\stm32f10x.h"

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/* Timer2中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/*UART1*/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

GPIO.c

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
/*******************************************************************************
* Function Name : GPIO_Configuration
* 设置PD3,PD4,PD5,PD6为键盘输入
* 设置PB0,5,8,9; PC5,7; PD7 ;PA8 为输出LED灯
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*允许总线CLOCK,在使用GPIO之前必须允许相应端的时钟.
从STM32的设计角度上说,没被允许的端将不接入时钟,也就不会耗能,
这是STM32节能的一种技巧,*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

/*初始化LED输出为0*/
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
LED5_OFF;
LED6_OFF;
LED7_OFF;
LED8_OFF;

/* PB0,5,8,9输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* PC5,7输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOC, &GPIO_InitStructure);

/*PA7,输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*PA8,输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);

}

hal.c

/***************************************************
**HAL.c
**主要用于芯片硬件的内部外围和外部外围的初始化,两大INIT函数
**在MAIN中调用,使MAIN函数中尽量与硬件库无关
***************************************************/

#include "STM32Lib\\stm32f10x.h"

//各个内部硬件模块的配置函数
extern void GPIO_Configuration(void); //GPIO
extern void RCC_Configuration(void); //RCC
extern void TIM_Configuration(void); //TIM
extern void USART_Configuration(void); //串口
extern void NVIC_Configuration(void); //NVIC
/*******************************
**函数名:ChipHalInit()
**功能:片内硬件初始化
*******************************/
void ChipHalInit(void)
{
//初始化时钟源
RCC_Configuration();

//初始化GPIO
GPIO_Configuration();

//初始化中断源
NVIC_Configuration();

//初始化串口
USART_Configuration();

//初始化定时器
TIM_Configuration();
}

/*********************************
**函数名:ChipOutHalInit()
**功能:片外硬件初始化
*********************************/
void ChipOutHalInit(void)
{

}

stm32f10x_it.c

/*******************************************************************************
* Function Name : TIM2_IRQHandler TIM2中断
* Description : This function handles TIM2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/

extern u32 count=0;
extern u8 flag=0;
void TIM2_IRQHandler(void)
{

if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
//必须清空标志位/ /
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

//点亮LED5//
LED5_ON;
//LED1直接操作寄存器方式的闪烁
GPIOA->ODR^=GPIO_Pin_8;

}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

//点亮LED6//
LED6_ON;
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

// 点亮LED7//
LED7_ON;
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

//点亮LED8//
LED8_ON;

}
else if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//熄灭所有LED//
count++;
flag=1;
if(count>=99999999)
count=0;

LED5_OFF;
LED6_OFF;
LED7_OFF;
LED8_OFF;
}
}

/*******************************************************************************
* Function Name : TIM3_IRQHandler
* Description : This function handles TIM3 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : TIM4_IRQHandler
* Description : This function handles TIM4 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TIM4_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : I2C1_EV_IRQHandler
* Description : This function handles I2C1 Event interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C1_EV_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : I2C1_ER_IRQHandler
* Description : This function handles I2C1 Error interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C1_ER_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : I2C2_EV_IRQHandler
* Description : This function handles I2C2 Event interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C2_EV_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : I2C2_ER_IRQHandler
* Description : This function handles I2C2 Error interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void I2C2_ER_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : SPI1_IRQHandler
* Description : This function handles SPI1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SPI1_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : SPI2_IRQHandler
* Description : This function handles SPI2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SPI2_IRQHandler(void)
{
}

/*******************************************************************************
* Function Name : USART1_IRQHandler
* Description : This function handles USART1 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
extern u8 Uart1_Get_Flag;
extern u8 Uart1_Get_Data;

void USART1_IRQHandler(void)
{
//接收中断
if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
Uart1_Get_Data=USART_ReceiveData(USART1);
Uart1_Get_Flag=1;
}

//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
USART_ReceiveData(USART1); //读DR
}
}

main.c

/************************************************************
**实验名称:Timer
**功能:实现Timer2的4组比较中断,此为STM32定时器的其中一个功能.4段捕获比较分别驱动四个LED点亮,
溢出中断则负责熄灭LED.
对于其它的定时器,基本用法均一样(除T1,T8高级定时器)
**注意事项:注意要开放stm32f10x_conf.h中的 #include "stm32f10x_tim.h" ,#include "misc.h"
**作者:电子白菜
*************************************************************/

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#define SIZE 0
u8 table[11]={"0123456789 "};
char buffer[10]={"0000000000"};
void Delay(u16 n);

void d_2_char(u32 x)
{
buffer[SIZE+0]=table[x%10000000000/100000];
buffer[SIZE+1]=table[x%1000000000/100000];
buffer[SIZE+2]=table[x%100000000/100000];
buffer[SIZE+3]=table[x%10000000/10000];
buffer[SIZE+4]=table[x%1000000/10000];
buffer[SIZE+5]=table[x%100000/10000];
buffer[SIZE+6]=table[x%10000/1000];
buffer[SIZE+7]=table[x%1000/100];
buffer[SIZE+8]=table[x%100/10];
buffer[SIZE+9]=table[x%10];
}
int main(void)
{

ChipHalInit(); //片内硬件初始化
ChipOutHalInit(); //片外硬件初始化

for(;;)
{
if(flag==1)
{
flag=0;
d_2_char(count);
USART1_Puts(buffer);
USART1_Puts("\r\n");
//Delay(2000);
}

}

}

//延迟函数
void Delay(u16 speed)
{
u16 i;
while(speed!=0)
{
speed--;
for(i=0;i<400;i++);
}
}

RCC.c

#include "STM32Lib\\stm32f10x.h"

RCC_ClocksTypeDef RCC_ClockFreq;

void RCC_Configuration(void)
{
SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置.具体请看2_RCC

/**************************************************
获取RCC的信息,调试用
请参考RCC_ClocksTypeDef结构体的内容,当时钟配置完成后,
里面变量的值就直接反映了器件各个部分的运行频率
***************************************************/
RCC_GetClocksFreq(&RCC_ClockFreq);

/* 这个配置可使外部晶振停振的时候,产生一个NMI中断,不需要用的可屏蔽掉*/
//RCC_ClockSecuritySystemCmd(ENABLE);
}

管理员在2009年8月13日编辑了该文章文章。 -->

650) this.width=650;" src="/image/default/tu_8.png">-->
关键字:STM32  定时器2  串口 引用地址:STM32 定时器2+串口

上一篇:关于STM32 定时器 PWM 实时调节占空比时,预装载特性
下一篇:STM32 定时器浅谈_1

推荐阅读最新更新时间:2024-03-16 14:57

STM32之外部中断例程
外部中断的基本步骤如下: 1.设置好相应的时钟; 2.设置相应的中断; 3.IO口初始化; 4.把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化; 5.在选择的中断通道的响应函数中中断函数。
[单片机]
<font color='red'>STM32</font>之外部中断例程
STM32固件库文件分析
1-汇编编写的启动文件 startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用C库函数_main最终去到C的世界 2-时钟配置文件 system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M。 3-外设相关的 stm32f10x.h:实现了内核之外的外设的寄存器映射 xxx:GPIO、USRAT、I2C、SPI、FSMC stm32f10x_xx.c:外设的驱动函数库文件 stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明 4-内核相关的 CMSIS - Cortex 微控制器软件接
[单片机]
stm32 定时器5输入捕获
timer.h #ifndef _TIM5SANP_H #define _TIM5SANP_H #include sys.h void TIM14_PWM_Init(u32 arr,u32 psc); void TIM5_CH1_Cap_Init(u32 arr,u16 psc); #endif timer.c #include timer.h TIM_ICInitTypeDef TIM5_ICInitStructre; void TIM5_CH1_Cap_Init(u32 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeD
[单片机]
stm32定时器时间计算
  STM32定时器的工作原理   STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)   T=1/F (F为频率)   例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为   1 2 MHz / 2 = 1 MHz   Tt = 1 / 1 MHz = 1 us   最小定时时间T=1/1MHz=1us   51单片机定时器:   方式0 13位最大定时时间间隔2^13=8.192ms   方式1 16位最大定时时间间隔2^16=65.536ms   方式2 8位最大定时时间间隔2^8=256us   由此我们知道对于
[单片机]
STM32 NVIC 抢占优先级和响应优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性, 其属性编号越小,表明它的优先级别越高。 抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断 (在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续 执行中断服务函数 A),抢占属性由 NVIC_IRQChannelPreemptionPriority 的参 数配置。 而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先 级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性 由 NVIC_IRQChannelSubPriority 的参数配置。 例如,现在有三个中断向量: 中断向量 抢占优先级
[单片机]
关于STM32虚拟蜡烛效果测试
很简单实现的一个东西。就只需要一个 口,一个麦克风,还有刷图片来形成动态效果,麦克风的也也很简单。就这样能实现出一个吹蜡烛的效果出来。至于这个想法也是基于自己之前玩过手机打火机的联想到了。自己还加了,播放生日快乐歌。
[机器人]
深度解读STM32数据保存与毁灭
一、认识ADC兼进一步看懂STM的库 ADC是多少位的? 12位 ADC有多少个? 1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。 关于通道的名堂: 10.3.3 通道选择 有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 ● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L[3:0]位中。 ● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入
[单片机]
高速DSP与PC实现串口通信的方法
  数字信号处理器(Digital Signal Processor,DSP)在图形图像处理、高精度测量控制、高性能仪器仪表等众多领域得到越来越广泛的应用,实际运用中,通常须将DSP采集处理后的数据传送到PC机,然后进行存储和处理。   T1公司的TMS320VC33微处理器具有性价比高,同时,该芯片的I/O电平、字长、运行速度、串口功能具有大多数DSP的共同特点。本文针对TMS320VC33与PC RS-232的通讯,分析三种具体的接口电路和软件设计方法,实现高速DSP与低速设备的通讯:①通过TMS320VC33的通用I/O口实现通信;②通过TMS320VC33中可设置为通用I/O的串行引脚实现通信;③直接利用TMS320V
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved