历史上的今天
今天是:2024年08月23日(星期五)
2019年08月23日 | STM32学习日志--使用DMA功能自动更新PWM的输出
2019-08-23 来源:eefocus
/*******************************************************************************
编译环境: EWARM V5.30
硬件环境: DZY2.PCB
STM32 FW: V3.0.0
作者 : szlihongtao
******************************************************************************
REV : V1.00
DATE : 2011-04-18
NOTE :
*******************************************************************************/
#include "stm32f10x.h"
#include "stm32_m.h"
#include "dzy.h"
#include "myRCC.h"
//******************************************************************************
#define TIM1_CCR3_Address 0x40012C3C
bit f_tb; // 基本定时标志
bit f_100ms, f_1000ms;
INT16U cnt_test; // 计数器,仅供软件调试使用
float clk_sys; // 仅供软件调试使用
#if 1
uint16_t SRC_Buffer[ ] =
{ 72 * 5 }; // 由于载波频率取20kHZ,所以最大脉冲宽度不要超50us,即常数不要超过72*50
#else
uint16_t SRC_Buffer[]=
{ 72*2,72*5,72*10,72*20,72*40,72*10}; // 由于载波频率取20kHZ,所以最大脉冲宽度不要超50us,即常数不要超过72*50
#endif
//******************************************************************************
// 延时程序,单位为*1ms
//******************************************************************************
void delayms( INT16U cnt )
{
//#define CONST_1MS 7333 // 72MhZ
//#define CONST_1MS 3588 // 32MhZ
#define CONST_1MS (105*FCLK)
INT16U i;
__no_operation( );
while ( cnt-- )
for ( i = 0; i < CONST_1MS; i++ )
;
}
//******************************************************************************
// pcb上的指示灯
//******************************************************************************
static void led_toggle( void )
{
GPIOC->ODR ^= GPIO_Pin_7; // led2 toogle
GPIOC->ODR ^= GPIO_Pin_6; // led3 toogle
}
//******************************************************************************
// 时钟设置初始化
//******************************************************************************
static void RCC_Configuration( void )
{
ErrorStatus HSEStartUpStatus;
/*
RCC_AdjustHSICalibrationValue 调整内部高速晶振(HSI)校准值
RCC_ITConfig 使能或者失能指定的RCC中断
RCC_ClearFlag 清除RCC的复位标志位
RCC_GetITStatus 检查指定的RCC中断发生与否
RCC_ClearITPendingBit 清除RCC的中断待处理位
*/
/* RCC system reset(for debug purpose) */
// 时钟系统复位
RCC_DeInit( );
// 使能外部的8M晶振
// 设置外部高速晶振(HSE)
/* Enable HSE */
RCC_HSEConfig( RCC_HSE_ON );
// 使能或者失能内部高速晶振(HSI)
RCC_HSICmd( DISABLE );
// 等待HSE起振
// 该函数将等待直到HSE就绪,或者在超时的情况下退出
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp( );
if ( HSEStartUpStatus == SUCCESS )
{
// 设置AHB时钟(HCLK)
RCC_HCLKConfig( RCC_HCLK_Div_ ); // 36 MHz
// 设置低速AHB时钟(PCLK1)
RCC_PCLK1Config( RCC_PCLK1_Div_ ); // 2.25 MHz
// 设置高速AHB时钟(PCLK2)
RCC_PCLK2Config( RCC_PCLK2_Div_ ); // 2.25 MHz
/* ADCCLK = PCLK2/8 */
// 设置ADC时钟(ADCCLK)
RCC_ADCCLKConfig( RCC_ADC_DIV_ ); // 0.281Mhz
// 设置USB时钟(USBCLK)
// USB时钟 = PLL时钟除以1.5
//RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
// 设置外部低速晶振(LSE)
RCC_LSEConfig( RCC_LSE_OFF );
// 使能或者失能内部低速晶振(LSI)
// LSE晶振OFF
RCC_LSICmd( DISABLE );
// 设置RTC时钟(RTCCLK)
// 选择HSE时钟频率除以128作为RTC时钟
//RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
// 使能或者失能RTC时钟
// RTC时钟的新状态
RCC_RTCCLKCmd( DISABLE );
/* Flash 2 wait state */
FLASH_SetLatency( FLASH_Latency_2 );
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable );
/* PLLCLK = 8MHz * 9 = 72 MHz */
// 设置PLL时钟源及倍频系数
RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_ );
/* Enable PLL */
// 使能或者失能PLL
RCC_PLLCmd( ENABLE );
/* Wait till PLL is ready */
// 检查指定的RCC标志位设置与否
while ( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET )
{
}
/* Select PLL as system clock source */
// 设置系统时钟(SYSCLK)
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
/* Wait till PLL is used as system clock source */
// 返回用作系统时钟的时钟源
while ( RCC_GetSYSCLKSource( ) != 0x08 )
{
}
}
// 使能或者失能AHB外设时钟
RCC_AHBPeriphClockCmd(
RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2 | RCC_AHBPeriph_SRAM
| RCC_AHBPeriph_FLITF | RCC_AHBPeriph_CRC | RCC_AHBPeriph_FSMC
| RCC_AHBPeriph_SDIO, DISABLE );
// 使能或者失能APB1外设时钟
RCC_APB1PeriphClockCmd( RCC_APB1Periph_ALL, DISABLE );
// 强制或者释放高速APB(APB2)外设复位
RCC_APB2PeriphResetCmd( RCC_APB2Periph_ALL, ENABLE );
// 退出复位状态
RCC_APB2PeriphResetCmd( RCC_APB2Periph_ALL, DISABLE );
// 强制或者释放低速APB(APB1)外设复位
RCC_APB1PeriphResetCmd( RCC_APB1Periph_ALL, ENABLE );
// 强制或者释放后备域复位
RCC_BackupResetCmd( ENABLE );
// 使能或者失能时钟安全系统
RCC_ClockSecuritySystemCmd( DISABLE );
}
//******************************************************************************
// NVIC设置
//******************************************************************************
void NVIC_Configuration( void )
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
}
//******************************************************************************
// SysTick设置初始化
//******************************************************************************
static void SysTick_Config1( void )
{
#if 1
#define SystemFreq (FCLK*1000000.0) // 单位为Hz
#define TB_SysTick (TIME_TB*1000) // 单位为uS,与示波器实测一致
static INT32U ticks;
ticks = ( INT32U )( ( TB_SysTick / 1000000.0 ) * SystemFreq );
SysTick_Config( ticks );
#endif
}
//******************************************************************************
// GPIO设置
//******************************************************************************
static void GPIO_Configuration( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE );
//------------------------------------------------------------------------------
GPIO_Write( GPIOA, 0xffff );
/* GPIOA Configuration: Channel 3 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );
//------------------------------------------------------------------------------
GPIO_Write( GPIOB, 0xffff ); // 11111101-11111111
/* GPIOB Configuration: Channel 3N as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( GPIOB, &GPIO_InitStructure );
//------------------------------------------------------------------------------
GPIO_Write( GPIOC, 0xff0f ); // 11111111-00001111
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_4
| GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOC, &GPIO_InitStructure );
//------------------------------------------------------------------------------
GPIO_Write( GPIOD, 0xffff ); // 11111111-11111111
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2;
史海拾趣
|
关于STM32,TI,NXP的ARM Cortex-m3学习板申请体会 这三家的都申请过,有一些想法 ST最大方,板子,光盘,连接线一应俱全。 并且ST搞过好几次免费申请活动,每次免费送的套件数量还比较大。 拿到套件后就能直接上手练习了。 TI其次,申请的TI套件,使用手册里明明说的是有两块板子,可是我只收到 ...… 查看全部问答> |
|
代码如下: SOCKET Sock = INVALID_SOCKET; // Datagram window socket SOCKADDR_IN source_sin; &n ...… 查看全部问答> |
|
在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。 如何理解,是否要用概率论的模型去解释? ...… 查看全部问答> |
|
之前关于EVC下图形编程画二维曲线问题已经有了进展,现在刚画出简单的二维曲线,就是随机折线那样的,主要通过两个随机数nRandomX = rand() % 10;nRandomY = rand() % 10; 主要代码如下: BOOL CDraw2DGraphDlg::OnInitDialog() {   ...… 查看全部问答> |
|
我的解决方法是用1117-3.3,相信这个芯片大家都有。它的引脚和BL相同,但板上封装是sot89,我手头只有sot223,我把1脚和3脚向里折了一下,注意不要折断,然后再焊上就可以了。这时板子上D2不要焊,L1用焊锡直接连上就可以了。 现在板子的电压是3.3V ...… 查看全部问答> |
|
Ver 0.1 - Jeffrey1.MSP430 入门2.如何为我的应用选择最合适的MSP430 芯片?3.与MSP430 的引导加载程序通信的开发工具4.MSP430 需配合何种晶振工作?5.使用哪款MSP430 编程器可以用来烧断JTAG 熔丝?6.要实现MSP430 编程,应如何连接JTAG?7 ...… 查看全部问答> |
|
1设计要求 2设计方案 3选便宜的看看,效率和下边那个是什么 4原理图 在选择方案时会出现相关LED厂家产品的选择很方便,可以参考修改设计,找到更加合适方案 … 查看全部问答> |




