标题:
关于DDS在stm32单片机上显示的有关程序
[打印本页]
作者:
柴科夫斯
时间:
2018-5-9 10:23
标题:
关于DDS在stm32单片机上显示的有关程序
该程序可以实现在stm32上实现屏幕显示和键盘输入控制
单片机源程序如下:
#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#include "drivers.h"
// dds base freq : 0.9765625HZ
/*------------------Macro Defines----------------------------------*/
#define SYSTEMTICK_PERIOD_MS 10
#define LED_PERIOD 1000
/*------------------------------------------------------------------*/
struct DDS_PARA{
uint8_t wave_type;
uint32_t freq_step;
uint32_t freq;
uint8_t phase;
};
enum PARA_TYPE{ NONE = 0, FREQ = 1, PHASE = 2};
/*------------------------------------------------------------------*/
extern uint8_t usart2_rx_buf[255];
extern uint8_t usart2_frame_end;
__IO uint32_t _localTimeTick_ms = 0;
uint8_t usart_frame_buf[UART_FRAME_LENGTH] = {0};
uint16_t frame_seq = 0;
struct DDS_PARA dds_para_data;
enum PARA_TYPE setting_type = FREQ;
/*------------------------------------------------------------------*/
uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len);
void lcd_update(void);
uint8_t porcess_keybard_value(UserAckKeyValueType key_value);
void lcd_update_actual_freq(void);
/*------------------------------------------------------------------*/
void SysTick_Handler(void) {
_localTimeTick_ms += SYSTEMTICK_PERIOD_MS;
}
uint32_t local_ticktime() {
return _localTimeTick_ms;
}
bool timeout(uint32_t last_time, uint32_t ms) {
return (bool)((_localTimeTick_ms - last_time) > ms);
}
void flash_led(void)
{
static uint32_t timer_tick;
static uint8_t led_status;
if(timeout( timer_tick, LED_PERIOD))
{
if(led_status == 0)
{
GPIO_ResetBits(RED_LED_GPIO, RED_LED_PIN);
led_status = 1;
}
else
{
GPIO_SetBits(RED_LED_GPIO, RED_LED_PIN);
led_status = 0;
}
timer_tick = local_ticktime();
}
}
void flush_dds_para(void)
{
dds_para_data.freq = 0;
dds_para_data.phase = 0;
setting_type = FREQ;
}
void init_data(void)
{
//frame header
usart_frame_buf[0] = PROTOCOL_UART_FRAME_START_SYMBOL_1;
usart_frame_buf[1] = PROTOCOL_UART_FRAME_START_SYMBOL_2;
usart_frame_buf[2] = 0x90;
usart_frame_buf[3] = 0x07;
//CRC
usart_frame_buf[12] = 0;
usart_frame_buf[13] = 0;
//frame tail
usart_frame_buf[14] = PROTOCOL_UART_FRAME_END_SYMBOL_1;
usart_frame_buf[15] = PROTOCOL_UART_FRAME_END_SYMBOL_2;
flush_dds_para();
LCD_ShowString(50, 20, 16, "DDS SIGNAL GENERTAOR" ,0);
LCD_ShowString(20, 60, 16, "Freq(HZ)(Goal):" ,0);
LCD_ShowString(20, 90, 16, "Freq(HZ)(Fact):" ,0);
LCD_ShowString(266, 90, 16, "." ,0);
LCD_ShowString(20, 120, 16, "Phase(degree):" ,0);
LCD_ShowString(20, 150, 16, "Input data:" ,0);
LCD_ShowString(20, 180, 16, "Setting Type(L-R):" ,0);
LCD_ShowString(200, 180, 16, "FREQ " ,0);
}
void init_drivers(void)
{
rcc_configuration();
GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE );
led_init();
init_keyBoard();
uart2_init();
init_lcd();
}
int main(void)
{
uint8_t fpga_ack = 0;
uint8_t resend_times = 0;
uint32_t usart_reack_timeout = 0;
UserAckKeyValueType keyVal;
float dds_step;
init_drivers();
init_data();
while(1)
{
flash_led();
if(usart2_frame_end == 1)
{
if(process_data_from_fpga(usart2_rx_buf, UART_FRAME_LENGTH) == 1)
{
fpga_ack = 0;
lcd_update_actual_freq();
}
memset(usart2_rx_buf, 0, UART_FRAME_LENGTH);
usart2_frame_end = 0;
}
if(fpga_ack == 1)
{
if(timeout(usart_reack_timeout, 2000))
{
resend_times++;
usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
usart_reack_timeout = local_ticktime();
}
if(resend_times >= 2)
{
fpga_ack = 0;
resend_times = 0;
}
}
if((keyVal = keyValueToUserAck()) != NOKEY)
{
if(porcess_keybard_value(keyVal))
{
dds_step = (dds_para_data.freq/0.9765625);
dds_para_data.freq_step = dds_step;
if((uint32_t)(dds_step/0.5)/2 == 1)
{
dds_para_data.freq_step++;
}
lcd_update();
frame_seq++;
usart_frame_buf[4] = frame_seq >> 8;
usart_frame_buf[5] = (uint8_t)frame_seq ;
usart_frame_buf[6] = (uint8_t)(dds_para_data.freq_step >> 24);
usart_frame_buf[7] = (uint8_t)(dds_para_data.freq_step >> 16);
usart_frame_buf[8] = (uint8_t)(dds_para_data.freq_step >> 8 );
usart_frame_buf[9] = (uint8_t)dds_para_data.freq_step;
usart_frame_buf[10] = dds_para_data.phase;
usart2_send_string(usart_frame_buf, UART_FRAME_LENGTH);
fpga_ack = 1;
usart_reack_timeout = local_ticktime();
}
}
}
}
uint8_t process_data_from_fpga(uint8_t* data_buf, uint8_t data_len){
uint8_t temp_data_buf[20] = {0};
uint8_t i;
if(data_len > 20)
{
return 0;
}
for(i = 0; i < data_len; i++)
{
temp_data_buf[i] = data_buf[i];
}
switch(temp_data_buf[2])
{
case 0x80: //from fpga
{
if(temp_data_buf[3] == 0x03)
{
if(temp_data_buf[6] == 0xA5)
return 1;
}
}
break;
default: break;
}
return 0;
}
void lcd_update_actual_freq(void)
{
float actual_freq;
actual_freq = dds_para_data.freq_step * 0.9765625;
LCD_ShowNum(170, 90, actual_freq, 12, 16);
LCD_ShowNum(270, 90, (uint32_t)(actual_freq*100)%100, 3, 16);
}
void lcd_update(void)
{
uint32_t updated_freq ;
uint16_t updated_phase;
updated_freq = dds_para_data.freq;
updated_phase = dds_para_data.phase;
LCD_ShowNum(200, 60, updated_freq, 12, 16);
LCD_ShowNum(200, 120, updated_phase, 12, 16);
}
uint8_t porcess_keybard_value(UserAckKeyValueType key_value)
{
static uint32_t temp_value;
if(key_value < 10)
{
temp_value = temp_value*10 + (uint8_t) key_value;
LCD_ShowNum(200, 150, temp_value, 12, 16);
}
if(key_value == KEY_OK)
{
if(setting_type == FREQ)
{
dds_para_data.freq = temp_value;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DDS波形显示.rar
(224.84 KB, 下载次数: 25)
2018-5-9 20:16 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
YH8538
时间:
2019-8-7 20:59
好像要
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1