⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iar-

📁 IAR_example_EasyARM8962.zip
💻
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               spi_t_r_reg.c
** Latest modified Date:    2007-09-16
** Latest Version:          v1.0
** Descriptions:            通过 SSI 接口循环向外输出 0~F 的字模,74HC595 接收到 SSI 信号以后
**                          在八段数码管上显示相应的字符。
**
**--------------------------------------------------------------------------------------------------------
** Created by:              Zhao shimin
** Created date:            2007-09-16
** Version:                 v1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             Kang qinhua
** Modified date:           2008.01.13
** Version:                 v1.1
** Descriptions:            
**
*********************************************************************************************************/
#define HWREG(x)		        (*((volatile unsigned long *)(x)))
#define SYSCTL_PERIPH_SSI       0x10000010                              /*  SSI 在系统控制器中的地址    */
#define SYSCTL_PERIPH_GPIOA     0x20000001                              /*  GPIO A 在系统控制器中的地址 */
#define SYSCTL_RCGC1            0x400fe104                              /*  运行模式时钟门控寄存器 1    */
#define SYSCTL_RCGC2            0x400fe108                              /*  运行模式时钟门控寄存器 2    */
#define SYSCTL_RCC              0x400fe060                              /*  运行-模式时钟配置寄存器     */
#define SYSCTL_PLLCFG           0x400fe064                              /*  XTAL-PLL转换寄存器          */

#define SYSCTL_RCC_XTAL_MASK    0x000003C0                              /*  Crystal attached to main osc*/

#define SYSCTL_RCC_OSCSRC_MASK  0x00000030                              /*  振荡器相关的位              */
#define SYSCTL_RCC_OSCSRC_MAIN  0x00000000                              /*  使用主振荡器                */
#define SYSCTL_RCC_OSCSRC_INT   0x00000010                              /*  使用内部振荡器              */
#define SYSCTL_RCC_OSCSRC_INT4  0x00000020                              /*  内部振荡器 / 4              */
#define SYSCTL_RCC_XTAL_SHIFT   6                                       /*  移位到振荡器的相关位        */
#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100                              /*  使用3.579545MHz 晶振        */
#define SYSCTL_RCC_BYPASS       0x00000800                              /*  PLL旁路                     */
#define SYSCTL_RCC_USE_SYSDIV   0x00400000                              /*  使用系统时钟除数            */
#define SYSCTL_RCC_SYSDIV_MASK  0x07800000                              /*  系统时钟除数                */
#define SYSCTL_RCC_SYSDIV_SHIFT 23                                      /*  移位到系统时钟除数的相关位  */

#define SYSCTL_PLLCFG_OD_MASK   0x0000C000                              /*  输出除数                    */
#define SYSCTL_PLLCFG_OD_1      0x00000000                              /*  OD值	   1                */
#define SYSCTL_PLLCFG_OD_2      0x00004000                              /* 		       2                */
#define SYSCTL_PLLCFG_OD_4      0x00008000                              /* 		       4                */
#define SYSCTL_PLLCFG_F_MASK    0x00003FE0                              /*  F输入值                     */
#define SYSCTL_PLLCFG_R_MASK    0x0000001F                              /*  R输入值                     */
#define SYSCTL_PLLCFG_F_SHIFT   5                                       /*  移位到F的相关位             */
#define SYSCTL_PLLCFG_R_SHIFT   0                                       /*  移位到R的相关位             */
	
#define SSI_BASE                0x40008000                              /*  SSI 基地址                  */
#define SSI_O_CR0               0x00000000                              /*  SSI 控制寄存器0             */
#define SSI_O_CR1               0x00000004                              /*  SSI 控制寄存器1             */
#define SSI_O_DR                0x00000008                              /*  SSI 数据寄存器              */
#define SSI_O_SR                0x0000000C                              /*  SSI 状态寄存器              */
#define SSI_O_CPSR              0x00000010                              /*  SSI 时钟分频寄存器          */
#define SSI_MODE_MASTER         0x00000000                              /*  SSI 主模式                  */
#define SSI_FRF_MOTO_MODE_0     0x00000000                              /*  Moto 帧格式,极性0,相位0   */
#define SSI_CR0_FRF_MASK        0x00000030                              /*  帧格式屏蔽                  */
#define SSI_CR1_SSE             0x00000002                              /*  同步端口使能                */
#define SSI_SR_TNF              0x00000002                              /*  TX FIFO未满                 */

#define GPIO_PORTA_BASE         0x40004000                              /*  GPIO A 端口基地址           */
#define GPIO_PIN_2              0x00000004                              /*  GPIO 引脚 2                 */
#define GPIO_PIN_3              0x00000008                              /*  GPIO 引脚 3                 */
#define GPIO_PIN_4              0x00000010                              /*  GPIO 引脚 4                 */
#define GPIO_PIN_5              0x00000020                              /*  GPIO 引脚 5                 */
#define GPIO_O_AFSEL            0x00000420                              /*  模式控制选择寄存器          */
#define GPIO_O_ODR              0x0000050C                              /*  开漏选择寄存器              */
#define GPIO_O_DEN              0x0000051C                              /*  数字输入使能寄存器          */


#define BitRate     115200                                              /*  设定波特率                  */
#define DataWidth   8                                                   /*  设定数据宽度                */

/*  此表为7段数码管显示0~F的字模                */
unsigned char DISP_TAB[16] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

const unsigned long g_pulXtals[] =
{
    3579545,
    3686400,
    4000000,
    4096000,
    4915200,
    5000000,
    5120000,
    6000000,
    6144000,
    7372800,
    8000000,
    8192000
};
/*********************************************************************************************************
** Function name:           delay
**
** Descriptions:            延时函数,输入参数越大,延时时间越长
**
** input parameters:        uld    延时时间值
** output parameters:       NONE
**                          
** Returned value:          NONE
**
** Created by:              Zhao shimin
** Created Date:            2007/09/16
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void delay (unsigned long uld)
{
    for(; uld; uld--);
}

/*********************************************************************************************************
** Function name:           SysCtlClockGet
**
** Descriptions:            获取系统时钟
**
** input parameters:        NONE
** output parameters:       NONE
**                          
** Returned value:          ulclk 时钟速率
**
** Created by:              Zhao shimin
** Created Date:            2007/09/16
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned long SysCtlClockGet (void)
{
    unsigned long ulRCC, ulPLL, ulClk;

    
    ulRCC = HWREG(SYSCTL_RCC);                                          /*  读RCC               */

    
    switch (ulRCC & SYSCTL_RCC_OSCSRC_MASK) {                           /*  获取基本时钟速率            */ 
   
    /*  主时钟模式                           */
    case SYSCTL_RCC_OSCSRC_MAIN:
        
         ulClk = g_pulXtals[((ulRCC & SYSCTL_RCC_XTAL_MASK) >>
                             SYSCTL_RCC_XTAL_SHIFT) -
                             (SYSCTL_RCC_XTAL_3_57MHZ >>
                             SYSCTL_RCC_XTAL_SHIFT)];
          break;

    /*  内部时钟                             */
    case SYSCTL_RCC_OSCSRC_INT:
      
          ulClk = 15000000;
          break;
    /*  内部时钟的/4                        */
    case SYSCTL_RCC_OSCSRC_INT4:
       
          ulClk = 15000000 / 4;
          break;
        
    default:
          return(0);
        
    }

    /*  使用PLL倍频的情况                  */
    if (!(ulRCC & SYSCTL_RCC_BYPASS)) {
        /*  获取PLL的配置值                */
        ulPLL = HWREG(SYSCTL_PLLCFG);

        ulClk = ((ulClk * (((ulPLL & SYSCTL_PLLCFG_OD_MASK) >>
                            SYSCTL_PLLCFG_F_SHIFT) + 2)) /
                 (((ulPLL & SYSCTL_PLLCFG_R_MASK) >>
                   SYSCTL_PLLCFG_R_SHIFT) + 2));

        /*  2分频                         */
        if (ulPLL & SYSCTL_PLLCFG_OD_2) {
        
            ulClk /= 2;
        }

        /*  4分频                         */
        if (ulPLL & SYSCTL_PLLCFG_OD_4) {
  
            ulClk /= 4;
        }
    }

    if (ulRCC & SYSCTL_RCC_USE_SYSDIV) {
        /* 	调整时钟                     */
        ulClk /= ((ulRCC & SYSCTL_RCC_SYSDIV_MASK) >>
                   SYSCTL_RCC_SYSDIV_SHIFT) + 1;
    }

    return(ulClk);
}

/*********************************************************************************************************
** Function name:           main
**
** Descriptions:            设置SSI,并从SPI接口输出0-F的字模数据到数码管上显示
**
** input parameters:        NONE
** output parameters:       NONE
**                          
** Returned value:          NONE
**
** Created by:              Zhao shimin
** Created Date:            2007/09/16
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int main(void)
{
	  
    unsigned long  ulMaxBitRate;
    unsigned long  ulPreDiv;
    unsigned long  ulSCR;
    unsigned long  ulClock;
    unsigned char  i;

    HWREG(SYSCTL_RCGC1) |= SYSCTL_PERIPH_SSI & 0x0fffffff;              /*  使能 SSI                    */ 
    HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOA & 0x0fffffff;            /*  使能 GPIO A 口              */
   
    HWREG(SSI_BASE + SSI_O_CR1) = 0;                                    /*  配置 SSI 为主模式           */ 
   
    ulClock      = SysCtlClockGet();
    ulMaxBitRate = ulClock / BitRate;
    ulPreDiv     = 0;
    do {
	
        ulPreDiv += 2;
        ulSCR = (ulMaxBitRate / ulPreDiv) - 1;
	} while (ulSCR > 255);

    HWREG(SSI_BASE + SSI_O_CPSR) = ulPreDiv;
  
    /*  设置 SSI 传输协议和时钟速率。              */
    HWREG(SSI_BASE + SSI_O_CR0) = ((ulSCR << 8) | (SSI_FRF_MOTO_MODE_0 << 6) |
                                  (SSI_FRF_MOTO_MODE_0 & SSI_CR0_FRF_MASK) | (DataWidth - 1));  
     
    HWREG(SSI_BASE + SSI_O_CR1) |= SSI_CR1_SSE;                         /*  使能 SSI                    */ 
    /*  设定 GPIO A 2~5 引脚为使用外设功能        */
    HWREG(GPIO_PORTA_BASE + GPIO_O_AFSEL) |=   (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
    HWREG(GPIO_PORTA_BASE + GPIO_O_ODR)   &=  ~(GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
    HWREG(GPIO_PORTA_BASE + GPIO_O_DEN)   |=   (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
 
    while (1) {
  
        /*  循环输出 0~F 的字模                  */
        for (i = 0; i < 16; i++) {
    
            /*  等待直到有空间                   */
            while (!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_TNF)) {
                ;
            }
            
            HWREG(SSI_BASE + SSI_O_DR) = DISP_TAB[i];                   /*  向SSI写数据                 */
            
            delay(600000);
        } 
     }

}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -