|
【STM32F7英雄联盟大赛】多功能测试仪器-信号发生器部分的软件代码编写以及初步调试
[复制链接]
本帖最后由 传媒学子 于 2015-12-21 13:39 编辑
前言:今天来讲解一下这部分的软件代码测试和初步调试目的:利用初步的数据手册,进行代码编写和初步PCB调试,关于调试部分统一放在第五贴中;
代码编写参考材料:dds芯片手册;
注意事项:在充分理解数据手册的基础上,进行PCB设计和严格参照数据手册进行代码编写;
废话不多说,直接上代码。
1.原始驱动代码:
- #include "driverlib.h"
- #define SET_FSYNC() GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN0) //P6.0->FSYNC
- #define CLR_FSYNC() GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN0)
- #define SET_SDO() GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN1) //P6.1->SDATA
- #define CLR_SDO() GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN1)
- #define SET_SCL() GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN2) //P6.2->SCLK
- #define CLR_SCL() GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN2)
- //Write AD9834 by 16 bit
- //data is written at the clock's falling edge
- void WriteToAD9834Word(unsigned short Buf)
- {
- unsigned short ValueToWrite = 0;
- //unsigned char i = 0;
- unsigned char j = 0;
-
- SET_SCL();
- CLR_FSYNC(); //FSYNC become low, indicate the beginning of the write
- ValueToWrite = Buf;
- for (j=0; j<16; j++)
- {
- SET_SCL();
- if(0x8000 == (ValueToWrite & 0x8000))
- {
- SET_SDO(); //Wirte 1
- }
- else
- {
- CLR_SDO(); //Write 0
- }
- CLR_SCL();
-
- ValueToWrite <<= 1; //Rotate data
- }
- SET_FSYNC(); //FSYNC become high, indicate the end of the write
- }
- void main(void)
- {
- //Stop WDT
- WDT_A_hold(WDT_A_BASE);
- //PA.x output
- GPIO_setAsOutputPin(
- GPIO_PORT_P6,
- GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2
- );
- SET_SCL();
- SET_FSYNC();
- //Write Sequence refer to Figure31,32 and Table 11 in the AD9834's datasheet
- //RESET: RESET=1,PIN/SW=0
- WriteToAD9834Word(0X0100);//写控制寄存器,复位器件
- //Write a full 28-Bit Word to Frequency Register: B28=1, RESET=1
- WriteToAD9834Word(0X2100);//写控制寄存器,复位器件,同时将B28=1可将一个完整字通过两次连续写入载入频率寄存器
- /************************************************************************************************************/
- //DB15 DB14 DB13 DB12 DB11 DB10 DB9 DB8 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
- //0 0 B28 HLB FSEL PSEL PIN/SW RESET SLEEP1 SLEEP12 OPBITEN SIGN/PIB DIV2 0 MODE 0
- /************************************************************************************************************/
- // 1 1 1 0
- //Frequency0//PSEL=0, PIN/SW=0
-
- WriteToAD9834Word(0X599A);//0101 1001 1001 1010 //750KHz Output, 75MHz MCLK 14LSB
- WriteToAD9834Word(0X4666);//0100 0110 0110 0110 //14MSB
- //Frequency1
- WriteToAD9834Word(0XB5C3);//WriteToAD9834Word(0XB5C3); 1011 //100kHz Output, 10MHz MCLK
- WriteToAD9834Word(0X80A3);;//WriteToAD9834Word(0X80A3);
- //Phase0 and Phase1
- WriteToAD9834Word(0XC000);
- WriteToAD9834Word(0XE000);
- //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=0,PSEL=0
- //WriteToAD9834Word(0X0000);
- //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=1,PSEL=1
- // WriteToAD9834Word(0X0C00); //正弦波
- //WriteToAD9834Word(0X0C02); //三角波
- WriteToAD9834Word(0X0C38);
- //while(1);
-
- //Enter LPM4 w/interrupts enabled
- __bis_SR_register(LPM4_bits + GIE);
- //For debugger
- __no_operation();
- }
复制代码 2.stm32代码:
头文件
- #ifndef _FACTION_H_
- #define _FACTION_H_
- #include "stm32f7xx_hal.h"
- //函数发生器
- #define SDATA(x) (GPIOB->ODR = ((GPIOB->ODR>>15)&0X01)? GPIOB->ODR&GPIOB->ODR&~(1<<15):GPIOB->ODR|(x<<15))//PB15
- #define SCLK(x) (GPIOI->ODR = ((GPIOI->ODR>>1)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<1):GPIOI->ODR|(x<<1))//PI1
- #define FSELECT(x) (GPIOI->ODR = ((GPIOI->ODR>>0)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<0):GPIOI->ODR|(x<<0))//PI0
- #define PSELECT(x) (GPIOA->ODR = ((GPIOA->ODR>>15)&0X01) ? GPIOA->ODR&GPIOA->ODR&~(1<<15):GPIOA->ODR|(x<<15))//PA15
- #define FSYNC(x) (GPIOI->ODR = ((GPIOI->ODR>>2)&0X01) ? GPIOI->ODR&GPIOI->ODR&~(1<<2):GPIOI->ODR|(x<<2))//PI2
- #define RESET(x) (GPIOA->ODR = ((GPIOA->ODR>>0)&0X01) ? GPIOA->ODR&GPIOA->ODR&~(1<<0):GPIOA->ODR|(x<<0))//PA0
- #define SJ 0X0C02//三角波
- #define Sin 0X0C00//正弦波
- void Faction_Test(unsigned short datas);
- #endif
复制代码主函数
- #include "faction.h"
- void functionGenerator_GPIO_Init(void)
- {
- //FSELECT-PI0,PSELECT-PA15,SI,SCK共用了,FSYNC-PI2,RESET-PA0
- RCC->AHB1ENR |= 1<<8;//GPIOI
- GPIOI->MODER &= 0XFFFFFFCC;
- GPIOI->MODER |= 0X00000011;//通用推完输出
- GPIOI->OSPEEDR &= 0XFFFFFFCC;
- GPIOI->OSPEEDR |= 0X00000000;//GPIO高速输出
- GPIOI->PUPDR &= 0XFFFFFFCC; //GPIO无上下拉
-
- RCC->AHB1ENR |= 1<<0;//GPIOA
- GPIOB->MODER &= 0X3FFFFFFC;
- GPIOB->MODER |= 0X40000001;//通用推完输出
- GPIOB->OSPEEDR &= 0X3FFFFFFC;
- GPIOB->OSPEEDR |= 0XC0000000;//GPIO高速输出
- GPIOB->PUPDR &= 0X3FFFFFFC; //GPIO无上下拉
- }
- //Write AD9834 by 16 bit
- //data is written at the clock's falling edge
- void WriteToAD9834Word(unsigned short Buf)
- {
- unsigned short ValueToWrite = 0;
- //unsigned char i = 0;
- unsigned char j = 0;
-
- SCLK(1);
- FSYNC(0); //FSYNC become low, indicate the beginning of the write
- ValueToWrite = Buf;
- for (j=0; j<16; j++)
- {
- SCLK(1);
- if(0x8000 == (ValueToWrite & 0x8000))
- {
- SDATA(1); //Wirte 1
- }
- else
- {
- SDATA(0); //Write 0
- }
- SCLK(0);
- ValueToWrite <<= 1; //Rotate data
- }
- FSYNC(1); //FSYNC become high, indicate the end of the write
- }
- void Faction_Test(unsigned short datas)
- {
- functionGenerator_GPIO_Init();
- SCLK(1);
- FSYNC(1);
- //Write Sequence refer to Figure31,32 and Table 11 in the AD9834's datasheet
- //RESET: RESET=1,PIN/SW=0
- WriteToAD9834Word(0X0100);//写控制寄存器,复位器件
- //Write a full 28-Bit Word to Frequency Register: B28=1, RESET=1
- WriteToAD9834Word(0X2100);//写控制寄存器,复位器件,同时将B28=1可将一个完整字通过两次连续写入载入频率寄存器
- /************************************************************************************************************/
- //DB15 DB14 DB13 DB12 DB11 DB10 DB9 DB8 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
- //0 0 B28 HLB FSEL PSEL PIN/SW RESET SLEEP1 SLEEP12 OPBITEN SIGN/PIB DIV2 0 MODE 0
- /************************************************************************************************************/
- // 1 1 1 0
- //Frequency0//PSEL=0, PIN/SW=0
-
- WriteToAD9834Word(0X599A);//0101 1001 1001 1010 //750KHz Output, 75MHz MCLK 14LSB
- WriteToAD9834Word(0X4666);//0100 0110 0110 0110 //14MSB
- //Frequency1
- WriteToAD9834Word(0XB5C3);//WriteToAD9834Word(0XB5C3); 1011 //100kHz Output, 10MHz MCLK
- WriteToAD9834Word(0X80A3);;//WriteToAD9834Word(0X80A3);
- //Phase0 and Phase1
- WriteToAD9834Word(0XC000);
- WriteToAD9834Word(0XE000);
- //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=0,PSEL=0
- //WriteToAD9834Word(0X0000);
- //Select the Frequency Source and CLEAR RESET: RESET BIT=0, FSEL=1,PSEL=1
- //WriteToAD9834Word(0X0C00); //正弦波
- //WriteToAD9834Word(0X0C02); //三角波
- //WriteToAD9834Word(0X0C38);
- WriteToAD9834Word(datas);
- //while(1);
-
- //Enter LPM4 w/interrupts enabled
- //__bis_SR_register(LPM4_bits + GIE);
- //For debugger
- //__no_operation();
- }
复制代码
|
|