野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15260|回复: 4

MDK 可视化配置

[复制链接]
发表于 2016-4-20 09:30:20 | 显示全部楼层 |阅读模式
最近看到MDK有可视化配置的优势,进行尝试,初见成效分享给大家,个人认为对习惯直接操作寄存器比较有用,见效果图
目前对低功耗配置还不支持,因为外设时钟都是最大限度的接近能够运行的最高频率

#ifndef STM32_CFG_H
#define STM32_CFG_H

#define STM32F10X_HD                                                                                                // 定义MCU类型

//------------------ <<< Use Configuration Wizard in Context Menu >>> ------------------------------

//====================================== Clock Configuration =======================================
// <e0> 01、系统时钟配置
//         <o1> 外部晶振频率
//     <i> 内部晶振固定为8MHz
//           <3686400=> 3.6864MHz
//           <7372800=> 7.3728MHz
//           <8000000=> 8.0000MHz
//           <11059200=> 11.0592MHz
//   <o2.0> MCU晶振选择
//           <0=> 内部晶振HSI = 8MHz
//     <1=> 外部晶振HSE
//   <o3> PLL倍频系数
//     <i> SYSCLK = PLL * HSE 或者 SYSCLK = PLL * HSI / 2
//           <0=> 0
//           <1=> 1
//           <2=> 2
//           <3=> 3
//           <4=> 4
//           <5=> 5
//           <6=> 6
//           <7=> 7
//           <8=> 8
//           <9=> 9
//           <10=> 10
//           <11=> 11
//           <12=> 12
//           <13=> 13
//           <14=> 14
//           <15=> 15
//           <16=> 16
// </e> End of Clock Configuration

#define __CLOCK_SETUP                      1                                                                // 0
#define __HSE                               8000000                                                        // 1
#define __HSE_ENABLE                     1                                                                // 2
#define __PLL_NUM                          5                                                                // 3

//------------------ 系统时钟,HSI是2分频后进入PLL的 -----------------------------------------------
#define __HSI                                                 8000000UL

#if(__HSE_ENABLE)
        #if(__PLL_NUM < 2)
                #define        __SYS_CLK                        (__HSE)
        #else
                #define        __SYS_CLK                        (__PLL_NUM * __HSE)
        #endif
#else
        #if(__PLL_NUM < 2)
                #define        __SYS_CLK                        (__HSI)
        #else
                #define        __SYS_CLK                        (__PLL_NUM * __HSI / 2)
        #endif
#endif

//------------------ ADC时钟分频系数,最大程度接近14MHz --------------------------------------------
#if(__SYS_CLK) > 84000000                                                                                                                // 8分频
        #define __ADC_PRE                                0xC000
        #define        __ADC_CLK                                (__SYS_CLK / 8)
#elif(__SYS_CLK) > 56000000                                                                                                                // 6分频
        #define __ADC_PRE                                0x8000
        #define        __ADC_CLK                                (__SYS_CLK / 6)
#elif(__SYS_CLK) > 28000000                                                                                                                // 4分频
        #define __ADC_PRE                                0x4000
        #define        __ADC_CLK                                (__SYS_CLK / 4)
#elif(__SYS_CLK) > 14000000                                                                                                                // 2分频
        #define __ADC_PRE                                0x0000
        #define        __ADC_CLK                                (__SYS_CLK / 2)
#endif

//------------------ 低速APB1分频系数,最大程度接近36MHz -------------------------------------------
#if(__SYS_CLK) > 144000000                                                                                                                // 8分频
        #define __PPRE1                                        0x0600
#elif(__SYS_CLK) > 72000000                                                                                                                // 4分频
        #define __PPRE1                                        0x0500
#elif(__SYS_CLK) > 36000000                                                                                                                // 2分频
        #define __PPRE1                                        0x0400
#else                                                                                                                                                        // 不分频
        #define __PPRE1                                        0x0000
#endif

//------------------ 根据时钟配置定义Clock寄存器参数,AHB不分频 ------------------------------------
#if __HSE_ENABLE                                                                                                                                // 外部晶振
        #if (__PLL_NUM < 2)                                                                                                                        // 不使用PLL
                #define __RCC_CFGR_VAL          0x00000001
                #define __RCC_CR_VAL              0x00010000
        #else
                #define __RCC_CFGR_VAL          (0x00010002 | ((__PLL_NUM - 2) << 18) | __ADC_PRE | __PPRE1)
                #define __RCC_CR_VAL              0x01010002
        #endif
#else                                                                                                                                                        // 内部晶振
        #if (__PLL_NUM < 2)                                                                                                                        // 不使用PLL
                #define __RCC_CFGR_VAL          0x00000000
                #define __RCC_CR_VAL              0x00000083
        #else
                #define __RCC_CFGR_VAL          (0x00010002 | ((__PLL_NUM - 2) << 18) | __ADC_PRE | __PPRE1)
                #define __RCC_CR_VAL              0x01000001
        #endif
#endif


//====================================== Nested Vectored Interrupt Controller ======================
// <e0> 02、NVIC中断控制器配置
//   <e1.0> Vector Table Offset Register
//     <o2.29> TBLBASE: Vector Table Base
//       <i> Default: FLASH
//         <0=> FLASH
//         <1=> RAM
//     <o2.7..28> TBLOFF: Vector Table Offset <0x0-0x1FFFFFC0:0x80><#/0x80>
//       <i> Default: 0x00000000
//   </e>
//         <O3.0..2> NVIC中断优先级分组
//                 <i> STM32支持16个可编程的优先等级(使用了4位中断优先级)
//         <3=>  16个可编程的优先等级
// </e> End of Clock Configuration

#define __NVIC_SETUP                      1                                                                // 0
#define __NVIC_USED                       0                                                                // 1
#define __NVIC_VTOR_VAL                   0x00000000                                                // 2
#define        __NVIC_INT_GROUP                        3                                                                // 3

//====================================== Embedded Flash Configuration ==============================
// <e0> 03、嵌入式Flash配置
//   <o1.4> FLASH_ACR 预取缓冲区使能
// </e>

#define __FLASH_SETUP               1                                                                // 0
#define __FLASH_ACR_Val             0x00000010                                                // 1

//====================================== Debug MCU Configuration ===================================
// <e0> 04、MCU调试模块配置
//   <i> 软件模拟状态下,必须禁止MCU调试模块
//     <o1.8> 独立看门狗
//     <o1.9> 窗口看门狗
//     <o1.15> I2C1
//     <o1.16> I2C2
//     <o1.14> CAN1
//     <o1.21> CAN2
//     <o1.10> 定时器1
//     <o1.11> 定时器2
//     <o1.12> 定时器3
//     <o1.13> 定时器4
//     <o1.17> 定时器5
//     <o1.18> 定时器6
//     <o1.19> 定时器7
//     <o1.20> 定时器8
//     <o1.28> 定时器9
//     <o1.29> 定时器10
//     <o1.30> 定时器11
//     <o1.25> 定时器12
//     <o1.26> 定时器13
//     <o1.27> 定时器14
//     <o1.22> 定时器15
//     <o1.23> 定时器16
//     <o1.24> 定时器17
// </e>

#define        __DBGMCU_SETUP                                1                                                                // 0
#define        __DBGMCU_CR_Val                                0x7FFFFF00                                                // 1









配置

配置
回复

使用道具 举报

发表于 2016-4-20 10:04:05 | 显示全部楼层
这个功能很方便
回复 支持 反对

使用道具 举报

发表于 2016-4-29 09:40:09 | 显示全部楼层
能否提供一个完整的例子?比如配置usart1中断方式传输?谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-17 11:55:11 | 显示全部楼层
这个配置有点长,这里贴不了哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-17 12:03:49 | 显示全部楼层
/***************************************************************************************************
* 函数名称: STM32_UsartSetup()
* 函数功能: STM32 USART设置
* 使用说明:初始化USARTx相关寄存器
***************************************************************************************************/
void STM32_UsartSetup(void)
{
#if __USART1_SETUP
//--------------------------------------------------------------------------------------------------
//                                                                        USART1设置
//--------------------------------------------------------------------------------------------------
        RCC->AHBENR |= RCC_AHBENR_GPIOAEN;                                                    // 使能GPIOA时钟
        Delay(20);                                                                                                                // 延时以等待时钟设置生效
          GPIOA->AFR[1] &= ~(0xFFUL << 4);                                                                // 配置PA9、PA10为USART1的TXD、RXD功能
        GPIOA->AFR[1] |=  (0x11UL << 4);

        GPIOA->MODER   =  (GPIOA->MODER & ~(0x03UL << 18)) | (0x02UL << 18);        // 配置PA9为复用输出
        GPIOA->PUPDR   =  (GPIOA->PUPDR & ~(0x03UL << 18)) | (0x01UL << 18);
        GPIOA->OTYPER &= ~(1UL << 9);
        GPIOA->OSPEEDR =  (GPIOA->OSPEEDR & ~(0x03UL << 18)) | (0x03UL << 18);

        GPIOA->MODER   =  (GPIOA->MODER & ~(0x03UL << 20)) | (0x02UL << 20);        // 配置PA10为复用上拉
        GPIOA->PUPDR   =  (GPIOA->PUPDR & ~(0x03UL << 20)) | (0x01UL << 20);
          STM32_GpioTypeCfg(__USART1_PORT,__USART1_PIN,GPIO_MODE_GPP,GPIO_SPEED_LOW,GPIO_OUT_LOW);        // 配置收发控制引脚为输出

          RCC->APB2ENR |= RCC_APB2ENR_USART1EN;                                   // 使能USART1时钟
        Delay(20);                                                                                                                // 延时以等待时钟设置生效

          STM32_UsartSetBit(USART1,__USART1_BAUD,__USART1_BIT_MOD);                // 设置USART1波特率以及通信格式
          USART1->CR3  = 0x0000;                                                               // Set Flow Control
          USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE);                           // RX, TX enable

          if(__USART_INTERRUPTS & 0x01)                                                 // interrupts used
          {
                    USART1->CR1 |= USART_CR1_RXNEIE;                                                        // 接收缓冲区非空中断使能
                    NVIC_SetPriority(USART1_IRQn,__USART1_IPR);
                    NVIC_EnableIRQ(USART1_IRQn);                                                                // enable interrupt
          }

          USART1->CR1 |= USART_CR1_UE;                                            // USART enable
#endif
}
其实可视化配置就是初始化__USART1_BAUD,__USART1_BIT_MOD,__USART_INTERRUPTS 这些值,然后再用这些值去初始化寄存器
这里用得最多的就是预编译和宏了.
比如__USART1_BAUD为usart的传输比特率,__USART1_BIT_MOD为传输格式,__USART_INTERRUPTS 为中断使能,__USART1_IPR为中断优先级
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 03:41 , Processed in 0.031349 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表