#include "include.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_dma.h"
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "rocket.h"
#include "gpio.h"
#include "it.h"
#include "main.h"
#define SYSCLK_FREQ_72MHz CLK72M
void SimpleBeep(void);
void NVIC_SET(void);
void GPIO_SET(void);
void DMA_SET(void);
void TIM_SET(void);
void DMA_TRANSFER(void);
u16 DMA_send_feedback(DMA_Channel_TypeDef* DMA_CHx);
void DebugCCR(void);
//////////////////////////////////////////////////////////////////////////////
volatile u16 send_buf[size];
u32 DMA_ISR_COPY;
//KEY* K1 = KeyMap(GPIOA,GPIO_Pin_8,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K2 = KeyMap(GPIOB,GPIO_Pin_12,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K3 = KeyMap(GPIOB,GPIO_Pin_13,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K4 = KeyMap(GPIOB,GPIO_Pin_14,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K5 = KeyMap(GPIOB,GPIO_Pin_15,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K6 = KeyMap(GPIOC,GPIO_Pin_13,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K7 = KeyMap(GPIOC,GPIO_Pin_14,GPIO_Mode_IPU,GPIO_Speed_50MHz);
//KEY* K8 = KeyMap(GPIOC,GPIO_Pin_15,GPIO_Mode_IPU,GPIO_Speed_50MHz);
int count = 0;
int count_it = 0;
int InitDone = 0;
int main(void)
{
int i;
delay_init();
NVIC_SET();
GPIO_SET();
OLED_Init();
OLED_ColorTurn(0);//0������ʾ��1 ��ɫ��ʾ
OLED_DisplayTurn(0);//0������ʾ 1 ��Ļ��ת��ʾ
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
//SimpleBeep();
DelayBeep();
OLED_ShowString(0,48,"init_finish",8,1);
OLED_Refresh();
//TIM_SET();
//DMA_SET();
DMA_START();
while(1)
{
// DMA_Enable(PWM_TIM,DMA_CHANNEL);
// feedback = DMA_send_feedback(DMA_CHANNEL);
// if(feedback != 0)
// {
// OLED_ShowNum(64,0,feedback,4,16,1);
// OLED_Refresh();
// }
}
}
void GPIO_SET(void)
{
//打开端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//使用EXTI需要开AFIO(复用IO)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//蜂鸣器PA1,送方波,遇低电平触发
//StdSetGPIO(BeepPort, BeepPin,GPIO_Mode_Out_PP,GPIO_Speed_2MHz,1);
//增加NE555做振荡源,光耦PC817第1脚接VCC3.3,第2脚接BeepPin,
//当低电平时,才有电流经过PC817,所以需要低电平触发
//GPIO_Mode_IPU,默认处于高电平状态,没有电流通过
StdSetGPIO(BeepPort, BeepPin,GPIO_Mode_IPU,GPIO_Speed_2MHz,1);
//板载LED,PC13,LED接VCC,所以需要低电平触发
StdSetGPIO(OnBoardLedPort, OnBoardLedPin,GPIO_Mode_IPU,GPIO_Speed_2MHz,1);
//按键(上拉模式,置1)
StdSetGPIO(KeyPort, K1Pin|K2Pin|K3Pin|K4Pin|K5Pin|K6Pin|K7Pin|K8Pin,GPIO_Mode_IPU,GPIO_Speed_10MHz,1);
//外部中断
StdSetEXTI(GPIO_PortSourceGPIOA,GPIO_PinSource0,
EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5 | EXTI_Line6 | EXTI_Line7,
EXTI_Mode_Interrupt,EXTI_Trigger_Rising_Falling);
//14线检测PWM数量
StdSetGPIO(GPIOB, GPIO_Pin_14,GPIO_Mode_IPD,GPIO_Speed_50MHz,0);
StdSetEXTI(GPIO_PortSourceGPIOB,GPIO_PinSource14,
EXTI_Line14 ,
EXTI_Mode_Interrupt,EXTI_Trigger_Rising);
InitDone ++;
}
void NVIC_SET(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
StdSetNVIC(EXTI0_IRQn,1,1);
StdSetNVIC(EXTI1_IRQn,1,1);
StdSetNVIC(EXTI2_IRQn,1,1);
StdSetNVIC(EXTI3_IRQn,1,1);
StdSetNVIC(EXTI4_IRQn,1,1);
StdSetNVIC(EXTI9_5_IRQn,1,1);
StdSetNVIC(EXTI15_10_IRQn,1,0);
//StdSetNVIC(TIM3_IRQn,2,2);
}
u16 DMA_send_feedback(DMA_Channel_TypeDef* DMA_CHx)
{
return DMA_CHx->CNDTR;
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
//传输完成
void DMA1_Channel2_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC2) == SET)
{
DMA_ClearITPendingBit(DMA1_IT_TC2);
TIM_Cmd(PWM_TIM, DISABLE);
DMA_Cmd(DMA1_Channel2, DISABLE);
//调试,看状态
//OLED_ShowNum(0,48,(u32)DMA_GetFlagStatus( DMA1_FLAG_TC2 ),3,8,1);
//OLED_Refresh();
// // need to disable this, otherwise some glitches can occur (first bit gets lost)
// TIM_DMACmd(PWM_TIM, TIM_DMA_CC3, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC2); //完成后清除
GPIO_ResetBits(PwmPort,PwmPin);
DMA_SetCurrDataCounter( DMA1_Channel2 , size);
OLED_ShowString(0,48,"dma_disable",8,1);
OLED_Refresh();
}
if(DMA_GetITStatus(DMA1_IT_TE2) == SET)
{
DMA_ClearITPendingBit(DMA1_IT_TE2);
OLED_ShowString(0,48,"dma_error",8,1);
OLED_Refresh();
}
//ledBusy = 0; // get ready for next transfer
}
void DebugCCR(void)
{
OLED_ShowString(0,0,"CCR:",8,1);OLED_ShowNum(40,0,DMA_CHANNEL->CCR,12,8,1);
OLED_Refresh();
}
void DMA_SET(void)
{
StdSetGPIO(PwmPort,PwmPin,GPIO_Mode_AF_PP,GPIO_Speed_50MHz,0);
DMA_Cmd( DMA_CHANNEL, DISABLE);
TIM_Cmd(PWM_TIM,DISABLE);
StdSetTimeBase(PWM_TIM,99,71,0,TIM_CounterMode_Up,0,ENABLE);
StdSetTimOC(PWM_TIM,3,TIM_OCMode_PWM1,TIM_OCPolarity_High,0);
TIM_DMACmd(PWM_TIM, TIM_DMA_CC3, ENABLE);//TIM_CH3 比较捕获启动DMA传送
StdSetDMA(DMA1_Channel2,(u32)&(TIM3->ARR), (u32)&send_buf, size,DMA_Mode_Normal);
DMA_ITConfig(DMA_CHANNEL, DMA_IT_TC, ENABLE);//DMA1传输完成产生DMA中断
DMA_ClearFlag(DMA1_FLAG_TC2);//清满标志
DMA_ClearITPendingBit(DMA1_IT_TC2);
StdSetNVIC(DMA1_Channel2_IRQn,2,1);
BACKUP_DMA_ISR();
}
void DMA_START(void)
{
DMA_SET();
for(i = 0; i < size-1; ++i)
{
send_buf[i] = ( 1000 + 20 * i ) - 1;
}
send_buf[size - 1] = 0;
DMA_Cmd(DMA1_Channel2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM3->CCR3 = 500;
}
void DMA_Again(void)
{
DMA_Cmd( DMA_CHANNEL, DISABLE);
TIM_Cmd(PWM_TIM,DISABLE);
//delay_ms(10);
//while( DMA_GetCmdStatus( DMA_CHANNEL ) != DISABLE );
// DMA1->HIFCR |= 0x8000000; //清除发送完成标志
//DMA_ClearITPendingBit( DMA_CHANNEL, DMA_IT_TCIF7); //清除发送完成标志
//DMA_ClearITPendingBit(DMA1_IT_TC2);
//DMA_ClearFlag(DMA1_FLAG_TC2);
//DMA_CHANNEL->CPAR = (u32)&(PWM_TIM->ARR);
//DMA_CHANNEL->CMAR = (u32)&send_buf;
//DMA_SetCurrDataCounter( DMA_CHANNEL, size);
RESTORE_DMA_ISR();
//PWM_TIM->ARR = 999;
//PWM_TIM->CCR3 = 500;
PWM_TIM->CNT = 0;
PWM_TIM->EGR |= 0x1000;
DMA_Cmd( DMA_CHANNEL, ENABLE);
TIM_Cmd(PWM_TIM,ENABLE);
}
void BACKUP_DMA_ISR(void)
{
//中断状态寄存器
DMA_ISR_COPY = DMA1->ISR;
//中断状态标志清除寄存器
//u32 BACKUP_DMA_DMA_IFCR = DMA1->IFCR;
}
void RESTORE_DMA_ISR(void)
{
DMA1->ISR = DMA_ISR_COPY;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
stm32f103 定时器 PWM 模式 搭配 DMA 输出 精确脉冲 注意事项 1.压缩包内并未包括stm32外设固件库驱动,需要下载后,设置自己的include目录,具体自行百度。因为如果包括驱动会很大,另外,自己项目复制起来也会很大。 2.IDE是KEIL-ARM 5.29 4.工程设置是STM32F103C8T6,如果你也是这个芯片,还要改include目录 5.调试器是j-link,你的环境如果跟以上不一致,需要自己更改
资源详情
资源评论
资源推荐
收起资源包目录
STM32_DMA_PWM.zip (25个子文件)
STM32_DMA_PWM
STM32_DMA_PWM.uvguix.Administrator 176KB
DebugConfig
Target_1_STM32F103C8.dbgconf 7KB
Target_1_STM32F103C8_1.0.0.dbgconf 2KB
STM32_DMA_PWM.uvoptx 22KB
STM32_DMA_PWM.uvguix.vincent 177KB
STM32_DMA_PWM.uvprojx 21KB
keilkilll.bat 399B
.vscode
c_cpp_properties.json 4KB
uv4.log 1KB
settings.json 87B
uv4.log.lock 28B
keil-assistant.log 534B
EventRecorderStub.scvd 339B
Listings
JLinkSettings.ini 671B
rename.bat 242B
USER
stm32f10x_conf.h 3KB
inc
it2.h 2KB
key.h 85B
gpio.h 836B
include.h 370B
it.h 4KB
main.h 513B
stm32f10x_it.h 2KB
stm32f10x_it.c 4KB
main.c 7KB
Objects
共 25 条
- 1
ARWEI0005
- 粉丝: 15
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0