文档库 最新最全的文档下载
当前位置:文档库 › stm32 1602驱动

stm32 1602驱动

stm32 1602驱动
stm32 1602驱动

/******************************************************************** ******

**文件名称:LCD1602.h for STM32

**by 追梦 2011-4-5

********************************************************************* *****/

#ifndef LCD1602_STM32_H

#define LCD1602_STM32_H

#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS

#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0

#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW

#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1

#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E

#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2

#define DATAOUT GPIOD->ODR //PD[0..7]--(LCD)D0~D7

#ifndef uchar

#define uchar unsigned char

#endif

#ifndef uint

#define uint unsigned int

#endif

extern void delay_nms(unsigned long n);

extern void delay_nus(unsigned long n);

uint8_t LCD_busy(void); //读LCD忙碌状态,直到LCD1602不忙为止

void Wait_Leisure(void);//一直等待到LCD1602空闲

void LCD_WriteInitcmd(uchar cmd);//写入LCD初始化时的命令,不可以检测忙状态

void LCD_Writecmd(uchar cmd);//写指令到LCD1602,指令数据占一个字节void LCD_Writedata(uchar dat);//写一字节数据到LCD1602

void LCD_pos(uchar pos);//设定显示位置 00h~27h,40h~47h

void LCD_Setpos(uchar row,uchar col);//根据习惯设定显示位置

void LCD_DispChar(char ch);//显示一个字符

void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置显示一个字符

void LCD_DispString(char str[]);//使LCD1602显示一个字符串,显示位置需提前设定

void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602从指定位置开始显示一个字符串

void LCD_Dispnum(uint32_t num);//显示一个不超过8位的整数,显示位置需提前设置

void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置

显示一个不超过8位的整数

void LCD_DispDecimal(uint32_t num,uchar dot);//显示一个有效位不超过8

位的浮点数,显示位置需要提前设定

//在指定位置显示一个有效位不超过8位的浮点数

void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot); //显示日历,显示日期与时间

void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar

hour,uchar min,uchar sec);

//显示秒表,显示时,分,秒,10毫秒,精确到10ms

void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);

//显示频率计,动态自动调整频率显示

void LCD_DispFreq(uint32_t freq);

void LCD_ShiftLeft(void);//屏幕整体左移一格,用于滚动显示

void LCD_ShiftRight(void);//屏幕整体右移一格,用于滚动显示

void LCD_Clear(void);//清屏,清除显示

void LCD_Return(void);//使光标还回原点位置

void LCD_Close(void);//关显示

void LCD_Open(void);//开显示

void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符闪烁,不显示光标

void LCD_CloseFlicker(void);//关闭字符闪烁

void LCD_FlickerScreen(void);//屏幕秒闪烁一次

/******************************************************************** *

*名称:LCD_Init()

*功能:初始化LCD1602

*入口参数:无

*出口参数:无

*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us * 0x0C:开显示,关光标 40us

* 0x08:关显示,关光标 40us

* 0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右

* 0x0F:字符闪烁,开光标

* 0x06:写完数据自动右移光标,普通情形,从左向右显示 40us

* 0x04:写完数据自动左移光标,可以从右向左显示 40us

* 0x01:清除显示内容,即清屏 1.64ms

* 0x02:使光标还回起始位置 1.64ms

* 0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us

* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us

********************************************************************* /

void LCD_Init(void);

#endif

/******************************************************************** *

* 文件名称:LCD1602.C

* 功能:为51单片机提供LCD1602驱动程序,解决LCD1602与上层软件的隔离问题

* by:追梦 2011-4-5

********************************************************************* /

#include "stm32f10x.h"

#include "LCD1602.h"

#ifndef LCD1602_STM32_C

#define LCD1602_STM32_C

/******************************************************************** *

*名称:LCD_busy()

*功能:读LCD忙碌状态,直到LCD1602不忙为止

*入口参数:无

*出口参数:无符号字节类型,返回0表示LCD已经操作完毕,空闲。

*说明:一般在写入新命令或数据之前用while(LCD_busy())语句等待LCD 就绪

********************************************************************* /

uint8_t LCD_busy(void)

{

LCD_RS_0;

delay_nus(1);

LCD_RW_1;

delay_nus(1);

do

{

LCD_EN_0;

delay_nus(200);

LCD_EN_1;

delay_nus(200);

}

while(GPIOD->IDR & 0x80);

LCD_EN_0;

return (uint8_t)0;

}

/******************************************************************** *

*功能:一直等待到LCD1602空闲

********************************************************************* /

void Wait_Leisure(void)

{

LCD_busy();

}

/******************************************************************** *

*功能:写入LCD初始化时的命令,不可以检测忙状态

********************************************************************* /

void LCD_WriteInitcmd(uchar cmd)

{

LCD_RS_0;

delay_nus(1);

LCD_RW_0;

delay_nus(1);

DATAOUT = cmd;

LCD_EN_0;

delay_nus(300);

LCD_EN_1;

delay_nus(300);

LCD_EN_0;

delay_nms(2);

}

/******************************************************************** *

*名称:LCD_Writecmd()

*功能:写指令到LCD1602,指令数据占一个字节

*入口参数:cmd:待写入的指令

*出口参数:无

********************************************************************* /

void LCD_Writecmd(uchar cmd)

{

while(LCD_busy());

LCD_RS_0; //对同一个寄存器的两次写入,中间延时一会

delay_nus(1);

LCD_RW_0;

delay_nus(1);

LCD_EN_0;

delay_nus(300);//产生脉冲

DATAOUT = cmd;

LCD_EN_1;

delay_nus(300);//必要的延时

LCD_EN_0; //下降沿,LCD1602开始工作

}

/******************************************************************** *

*名称:LCD_Writedata()

*功能:写一字节数据到LCD1602

*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符

*出口参数:无

********************************************************************* /

void LCD_Writedata(uchar dat)

{

while(LCD_busy());//等待LCD1602空闲

LCD_RS_1;

delay_nus(1);

LCD_RW_0;

delay_nus(1);

DATAOUT = dat;

LCD_EN_1; //先拉高

delay_nus(300); //很重要的延时,经调试,延时300us以上才可以

LCD_EN_0; //下降沿,开始写入有效数据

}

/******************************************************************** *

*名称:LCD_pos()

*功能:设定显示位置

*入口参数:pos:显示位置,值的范围如下:

* 0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)

* 0x40----------------0x4f 0x50-------0x67 第二行

*出口参数:无

********************************************************************* /

void LCD_pos(uchar pos)

{

LCD_Writecmd(pos | 0x80);

}

/******************************************************************** *

*名称:LCD_Setpos()

*功能:根据习惯设定显示位置

*入口参数:row:行,row=1表示第一行,row=2表示第二行

* col:列,0~15,用于指定显示的列,范围可以是0~40

*出口参数:无

********************************************************************* /

void LCD_Setpos(uchar row,uchar col)

{

if(row==1) LCD_Writecmd(col | 0x80);

else LCD_Writecmd(col | 0xC0);

}

/******************************************************************** *

*功能:显示一个字符

*入口:ch:待显示的字符

********************************************************************* /

void LCD_DispChar(char ch)

{

LCD_Writedata(ch);

}

/******************************************************************** *

*功能:在指定位置显示一个字符

*入口:row:行 1或2 col:列,0~15

* ch:待显示的字符

********************************************************************* /

void LCD_Setpos_DispChar(uchar row,uchar col,char ch)

{

LCD_Setpos(row,col);

LCD_Writedata(ch);

}

/******************************************************************** *

*名称:LCD_DispString()

*功能:使LCD1602显示一个字符串,显示位置需提前设定

*入口参数:str[]:待显示的字符串

*出口参数:无

********************************************************************* /

void LCD_DispString(char str[])

{

uchar i=0;

while(str[i] != '\0')

{

LCD_Writedata(str[i]);

++i;

}

}

/******************************************************************** *

*名称:LCD_Setpos_DispString()

*功能:使LCD1602从指定位置开始显示一个字符串

*入口参数:row:显示行,1或2

* col:显示列,0~15 (0~40)

* str[]:待显示的字符串

*出口参数:无

*说明:指定位置是显示的初始位置,第一个字符显示的位置

********************************************************************* /

void LCD_Setpos_DispString(uchar row,uchar col,char str[])

{

LCD_Setpos(row,col);

LCD_DispString(str);

}

/******************************************************************** *

*名称:LCD_Dispnum()

*功能:显示一个不超过8位的整数,显示位置需提前设置

*入口参数:num:待显示的整数,不超过8位

*出口参数:无

********************************************************************* /

void LCD_Dispnum(uint32_t num)

{

uint i=0,j,k=0,wei,q;

char str[9];

if(num>=10000000)wei=8;

else if(num>=1000000)wei=7;

else if(num>=100000)wei=6;

else if(num>=10000)wei=5;

else if(num>=1000) wei=4;

else if(num>=100)wei=3;

else if(num>=10) wei=2;

else wei=1;

for(i=wei;i>0;i--)

{ q=1;

j=1; //i=1时,q=1,得到个位

for(;j

num %= q;

}

str[k] = '\0'; //添加字符串结束标志

LCD_DispString(str);//显示字符串

}

/******************************************************************** *

*名称:LCD_Setpos_Dispnum()

*功能:在指定位置显示一个不超过8位的整数

*入口参数:num:待显示的整数,不超过8位

*出口参数:无

********************************************************************* /

void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num)

{

LCD_Setpos(row,col);

LCD_Dispnum(num);

}

/******************************************************************** *

*名称:LCD_DispDecimal()

*功能:显示一个有效位不超过8位的浮点数,显示位置需要提前设定

*入口参数:num:待显示的浮点数放大后得到的整数,不超过8位

* dot:小数点的位数

*出口参数:无

********************************************************************* /

void LCD_DispDecimal(uint32_t num,uchar dot)

{

uint i=0,j,k=0,wei,q;

char str[10];

if(num>=10000000)wei=8;

else if(num>=1000000)wei=7;

else if(num>=100000)wei=6;

else if(num>=10000)wei=5;

else if(num>=1000) wei=4;

else if(num>=100)wei=3;

else if(num>=10) wei=2;

else wei=1;

for(i=wei;i>0;i--)

{ q=1;

j=1; //i=1时,q=1,得到个位

for(;j

num %= q;

}

str[k] = '\0'; //添加字符串结束标志

for(i=8;i>0;i--)

{ if((str[i]>='0')&&(str[i]<='9')) break;

}

str[i+2]='\0'; //添加字符串结束符

for(j=0;j

{

str[i+1]=str[i];

}

str[i+1]='.'; //插入小数点

LCD_DispString(str);//显示浮点小数

}

/******************************************************************** *

*名称:LCD_Setpos_DispDecimal()

*功能:在指定位置显示一个有效位不超过8位的浮点数

*入口参数:row:待显示的行 1,2

* col:待显示的列 0~15

* num:待显示的浮点数放大10的整数倍后得到的整数,不超过8位* dot:小数点的位数

*出口参数:无

********************************************************************* /

void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot) {

LCD_Setpos(row,col);

LCD_DispDecimal(num,dot);

}

/******************************************************************** *

*名称:LCD_DispDateTime()

*功能:显示日历,显示日期与时间

*入口参数:year:年,可以是任意值

* month:月,1~12

* day:日,1~31

* hour:时,1~24 或 1~12

* min:分,0~59

* sec:秒,0~59

*出口参数:无

*说明:使用前必须先宏定义USE_LCD_DISP_DATE,在包含文件之前定义有效

*显示格式:Date:yyyy-mm-dd *

* Time:hh:mm:ss *

********************************************************************* /

void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec)

{

LCD_Setpos(1,0);

LCD_DispString("Date:");

LCD_Dispnum((uint32_t)year);

LCD_DispChar('-');

LCD_Dispnum((uint32_t)month);

LCD_DispChar('-');

LCD_Dispnum((uint32_t)day);

LCD_Setpos(1,15);

LCD_DispChar('*'); //第一行结束符显示

LCD_Setpos(2,0);

LCD_DispString("Time:");

LCD_Dispnum((uint32_t)hour);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)min);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)sec);

LCD_Setpos(2,15);

LCD_DispChar('*'); //第二行结束符显示

}

/******************************************************************** *

*名称:LCD_DispStopWatch()

*功能:显示秒表,显示时,分,秒,10毫秒,精确到10ms

*入口参数:hour:时,1~24 或 1~12

* min:分,0~59

* sec:秒,0~59

* tenms:10ms计数值,如3表示30ms

*出口参数:无

*显示格式:Current Time: *

* hh:mm:ss:tt *

********************************************************************* /

void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms) {

LCD_Setpos(1,0);

LCD_DispString("Current Time:");

LCD_Setpos(1,15);

LCD_DispChar('*'); //第一行结束符显示

LCD_Setpos(2,2);

LCD_Dispnum((uint32_t)hour);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)min);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)sec);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)tenms);

LCD_Setpos(2,15);

LCD_DispChar('*'); //第二行结束符显示

}

/******************************************************************** *

*名称:LCD_DispFreq()

*功能:显示频率计,动态自动调整频率显示

*入口参数:freq:可以显示8位整数表示的频率值,频率范围1Hz~99MHz

*出口参数:无

*说明:入口的频率值单位是Hz,显示函数自动选择合适的显示方式

* freq>=1000000显示成6位小数的MHz

* else freq>=1000 显示成3位小数的KHz

* else freq>=0 默认显示单位是Hz (三个区间互斥)

********************************************************************* /

void LCD_DispFreq(uint32_t freq)

{

LCD_Setpos(1,0);

LCD_DispString("Current Freq:");

LCD_Setpos(2,1); //显示位置

if(freq>=1000000)

{

LCD_DispDecimal(freq,6);

LCD_DispString("MHz");

}

else if(freq>=1000)

{

LCD_DispDecimal(freq,3);

LCD_DispString("KHz");

}

else { LCD_Dispnum(freq);

LCD_DispString("Hz");

}

LCD_Setpos(2,14);

LCD_DispString("OK");

}

//屏幕整体左移一格,用于滚动显示

void LCD_ShiftLeft()

{

LCD_Writecmd(0x18);

}

//屏幕整体右移一格,用于滚动显示

void LCD_ShiftRight(void)

{

LCD_Writecmd(0x1C);

}

//清屏,清除显示

void LCD_Clear(void)

{

LCD_Writecmd(0x01);

}

//使光标还回原点位置

void LCD_Return(void)

{

LCD_Writecmd(0x02);

}

//关显示

void LCD_Close(void)

{

LCD_Writecmd(0x08);

}

//开显示

void LCD_Open(void)

{

LCD_Writecmd(0x0C);

}

/******************************************************************** *

*名称:LCD_FlickerChar()

*功能:使指定位置字符闪烁,不显示光标

*入口参数:row:行 1,2

* col:列 0~15

*出口参数:无

*说明:写命令0x0D不显示光标的闪烁,写命令0x0F是显示光标的闪烁* 一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C

********************************************************************* /

void LCD_FlickerChar(uchar row,uchar col)

{

LCD_Writecmd(0x0D);

LCD_Setpos(row,col);

}

//关闭字符闪烁

void LCD_CloseFlicker(void)

{

LCD_Writecmd(0x0C);

}

//屏幕秒闪烁一次

void LCD_FlickerScreen(void)

{

LCD_Writecmd(0x08);//关显示

delay_nms(500);

LCD_Writecmd(0x0C);//开显示

delay_nms(500);

}

/******************************************************************** *

*名称:LCD_Init()

*功能:初始化LCD1602

*入口参数:无

*出口参数:无

*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us * 0x0C:开显示,关光标 40us

* 0x08:关显示,关光标 40us

* 0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右

* 0x0F:字符闪烁,开光标

* 0x06:写完数据自动右移光标,普通情形,从左向右显示 40us

* 0x04:写完数据自动左移光标,可以从右向左显示 40us

* 0x01:清除显示内容,即清屏 1.64ms

* 0x02:使光标还回起始位置 1.64ms

* 0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us

* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us

********************************************************************* /

void LCD_Init(void)

{

delay_nms(200); //延时20ms

LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据

delay_nms(10);

LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据

delay_nms(5);

LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据

delay_nms(5);

LCD_WriteInitcmd(0x08); //先关显示,后开显示

delay_nms(5);

LCD_WriteInitcmd(0x06); //自动右移光标,0x04为左移光标

delay_nms(5);

LCD_WriteInitcmd(0x01); //清除LCD的显示内容

delay_nms(6);

LCD_WriteInitcmd(0x0c); //显示开,关光标;0x08为关显示

delay_nms(5);

}

#endif //防止多次编译

/*************************************************************

* LCD1602驱动显示实验

*by 追梦 2011-4-3、5

*************************************************************/

#include "stm32f10x.h"

#include "LCD1602.h"

#define PE00 (uint32_t *)0x40230180

//时钟配置函数 8MHz*9=72MHz

void RCC_Configuration()

{

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);//使能HSE

if(RCC_WaitForHSEStartUp()==SUCCESS)

{

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource()!=0x08);

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\

RCC_APB2Periph_GPIOD |

RCC_APB2Periph_GPIOE,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

}

//延时n us

void delay_nus(unsigned long n)

{

unsigned long j;

while(n--)

{ j=8;

while(j--);

}

}

//延时n ms

void delay_nms(unsigned long n)

{

while(n--)

delay_nus(1100);

}

//GPIO配置函数

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

GPIO_Init(GPIOD, &GPIO_InitStructure); //PD口OD输出

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PE.0~2 OD输出

GPIO_Init(GPIOE, &GPIO_InitStructure);

}

///////////////////////////////////////////

int main()

{

//uint32_t i=0;

char str[]={"happy!"};

RCC_Configuration();

GPIO_Configuration();

LCD_Init();

LCD_Setpos_DispString(1,3,str);

LCD_DispFreq(123456);

LCD_FlickerChar(2,3);

LCD_FlickerScreen();

LCD_FlickerScreen();

LCD_FlickerScreen(); delay_nms(2000);

LCD_CloseFlicker(); while(1)

{

};

}

奋斗STM32开发板Tiny NRF24L01转USB虚拟串口例程手册

奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验
https://www.wendangku.net/doc/3c9167398.html,
NRF24L01+转 USB 虚拟串口实验
实验平台:奋斗版STM32开发板Tiny 实验内容:板子通过USB加电后,先向串口1输出一串测试数据,然后USB被PC识 别出来,虚拟出一个串口号给这个USB设备,此时可以通过在PC端的串口助手类 软件选择该串口号。进入串口软件界面,可以通过软件无线收发一帧长度最长 为32字节的数据。该例程可以和V3及MINI板的NRF24L01 UCGUI例程配合使用。
预先需要掌握的知识 2.4G通信模块NRF24L01 1. 产品特性
2.4GHz 全球开放ISM 频段,最大0dBm 发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9 1.9~3.6V 低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125 频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。 低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等, NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口, 便于使用低成本单片机。 便于开发:由于链路层完全集成在模块上,非常便于开发。 自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC 检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM 间距接口,便于嵌入式应用
2.基本电气特性
淘宝店铺:https://www.wendangku.net/doc/3c9167398.html,
1

STM32利用虚拟串口调试

STM32串口利用虚拟串口调试 解决*** error 30: undefined name of virtual register 问题 以下摘录于网络。 1. 利用VSPD将PC上的两个虚拟串口连接起来。如图我将COM2 和COM3连接起来。点击Addr pair。 2. 可以看到Virtual ports上将两个虚拟串口连接到了一起了。 3.虚拟串口准备就绪了。先将直接输入命令的方式来调试。我们打开KEIL MDK的,设置成仿真的模式。点DEBUG.在COMMAND串口输入: MODE COM2 38400, 0, 8, 1

说明: MODE命令的作用是设置被绑定计算机串口的参数。基本使用方式为:

MODE COMx baudrate, parity, databits, stopbits 其中: COMx(x = 1,2,…)代表计算机的串口号; baudrate代表串口的波特率;parity代表校验方式; databits代表数据位长度; stopbits代表停止位长度。 例如:MODE COM1 9600, n, 8, 1 设置串口1。波特率为9 600,无校验位,8位数据,1位停止位。 MODE COM2 19200, 1, 8, 1 设置串口2。波特率为19 200,奇校验,8位数据,1位停止位。 4、点回车后,再输入ASSIGN COM2 S1OUT 说明: COMx代表计算机的串口,可以是COM1、COM2、COM3或其他; inreg和outreg代表单片机的串口。对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。 例如:ASSIGN COM1 < SIN > SOUT 将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。 ASSIGN COM2 < SIN > SOUT 将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。 需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

STM32F107+ULN2003+步进电机

STM32F107+ULN2003+步进电机,主要是步进电机部分,只写了正转,控制转速靠延时函数delayl(),反转的话还要写一个函数,将那把个数倒过来送过去,先送9,最后送8. int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ uint32_t Times = 0; uint8_t ucStr[80] = {0}; uint32_t num = 0; /* 3?ê??ˉ°???LED??ê?μ? */ SZ_STM32_LEDInit(LED1); SZ_STM32_LEDInit(LED2); SZ_STM32_LEDInit(LED3); SZ_STM32_LEDInit(LED4); SZ_STM32_SysTickInit(1000); SZ_STM32_COMInit(COM1, 115200); COTR_Init(); /* Infinite loop ?÷?-?· */ while (1) { /* LED1??ê?μ?×′ì?è?·′ */ LED1OBB = !LED1OBB; */ Zhengzhuan(); } } /*********μ??ú**********************/ void delayl(unsigned int dl) { unsigned int i,y; for(i = 0; i < 5000; i++)

基于STM32和L6208的步进电机控制系统

基于STM32和L6208的步进电机控制系统 摘要:本文介绍了步进电机的基本工作原理及控制方法,通过对ARM公司的STM32F103XX处理器Cortex-M3和ST公司步进电机驱动芯片L6208性能和驱动原理的深入分析,阐述了一种新型驱动步进电机的控制系统。本控制系统能够实时、准确、可靠地控制两相两极的步进电机。 关键词:STM32、L6208、步进电机 Abstract:This paper introduced the basic work principle and control methods, By introducing the performance of STM32F103XX and thorough analyzing the drive principle of DMOS driver for bipolar steeper motor L6208, I expounded a new control system for driving steeper motor. This control system can control bipolar stepper motor real-time, well and truly and reliably. Key words: STM32, L6208, stepper motor 第1章引言 本系统采用STM32F103XX微控制器驱动双极性步进电机的方法,执行整步和半步模式来控制步进电机。用户可以选择:操作模式(整步/半步);电机旋转方式(顺时针/逆时针);当前控制模式(快速/慢速)。这种方法使用中密度STM32F103XX微控制器和全集成两相步进电机驱动L6208,这是性价比最高和最简单的方式获得最小的CPU负载。Cortex-M3是专门在微控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能而设计的,它大大简化了编程的复杂性,集高性能、低功耗、低成本于一体。 本设计的主要特点: 1、不需反馈器件,比其他运动控制系统成本低。 2、尤其在低速扭转力和强稳定性方面具有优势。 3、低功耗,高性能并且灵活,可用于机器人控制,机械工具转弯处,影像和其它精准 的轴位置控制环境。 4、高性能的STM32F103XX微控制器驱动步进电机依赖于控制器的低计算环境。 第2章方案比较与论证 总体系统框图如图1所示:

基于STM32的步进电机控制系统

基于STM32的步进电机控制系统

摘要 本文的主要工作是基于STM32步进电机控制系统的设计。随着越来越多的高科技产品逐渐融入了日常生活中,步进电机控制系统发生了巨大的变化。单片机、C 语言等前沿学科的技术的日趋成熟与实用化,使得步进电机的控制系统有了新的的研究方向与意义。本文描述了一个由STM32微处理器、步进电机、LCD显示器、键盘等模块构成的,提供基于STM32的PWM细分技术的步进电机控制系统。该系统采用STM32微处理器为核心,在MDK的环境下进行编程,根据键盘的输入,使STM32产生周期性PWM信号,用此信号对步进电机的速度及转动方向进行控制,并且通过LCD显示出数据。结果表明该系统具有结构简单、工作可靠、精度高等特点. 关键词:STM32微处理器;步进电机;LCD显示;PWM信号;细分技术

Abstract As well as the high-tech products gradually integrated into the daily life,servo control system has undergone tremendous changes.SCM and C language of the frontier disciplines such mature technology and practical,steering control system is a new research direction and meaning.This paper describes a STM32 microprocessors, steering, LCD display and keyboard, Based on the STM32 servo control system of PWM signal,This system uses STM32 microprocessor as the core, MDK in the environment, according to the keyboard input , STM32 produce periodic PWM signal, with this signal to the velocity and Angle of steering gear control, and through the LCD display data. The features of the simple hardware, stable operation and high precision are incarnated in the proposed system. Keywords:STM32 microprocessors; Steering system; LCD display;pulse width modulation signal;Subdivide technology

用stm32库函数编写的modbus源代码

用stm32库函数编写的modbus源代码 说在前面的话: 1.请勿盲目抄袭。这个协议使用了一个定时器,所以在别处请不要再使用,如果定时器不够用,可以做虚拟定时器。也就是采用一个物理的定时器产生时基。在这个定时器的中断函数中可以给相应的多个定时器自加1.每个虚拟定时器可以用两个变量分别控制打开关闭,和计时。这个已经试验通过了可行的。其实就跟我们使用物理的定时器一样,只不过物理的定时器是用晶振产生时基。 2.这段代码已经调试通过了,也硬件试验过,没有问题,如果你出现问题了,看看你在主函数的的各种基本配置有没有完成。如果要使用06和10号功能,你还需要在主函数中建立一个100个元素的数组,每个元素是16位。 3.写这个文档的时候,这个协议已经是半年前完成的了。所以有些东西记得不是很清楚了,如果说错了,请以实际为准。只是不想让这份代码死在电脑中了,所以才想起来要拿出来分享,支持开源精神。 4.如果实在实在是没有弄出来,请联系我,可以共同交流,我的邮箱:xiaozuoadamszju@https://www.wendangku.net/doc/3c9167398.html,

#include"stm32f10x.h" /* 此Modbus协议暂时只支持RTU模式,只支持作为Modbus从设备。 暂时支持的功能码(16进制)如下表所示: 01.读线圈状态(读多个输出位的状态,有效地位为0-31) 02.读输入位状态(读多个输入位的状态,有效地位为0-31) 03.读保持寄存器(读多个保持寄存器的数值,有效地位为0-99) 04.读输入寄存器(读多个输入寄存器的数值,有效地址为0-1) 05.强制单个线圈(强制单个输出位的状态,有效地位为0-31) 06.预制单个寄存器(设定一个寄存器的数值,有效地址为0-99) 0F.强制多个线圈(强制多个输出位的状态,有效地址为0-31) 10.预制多个寄存器(设定多个寄存器的数值,有效地址为0-99) 暂时支持的错误代码为: 01 不合法功能代码从机接收的是一种不能执行功能代码。发出查询命令后,

【设计教程大集合】STM32F3XX大全

STM32F3系列是意法半导体ARM? Cortex?-M4微控制器产品组合的入门级产品。经过市场检验的M4处理器内核可支持DSP指令,内置浮点单元(FPU),运行频率高达72MHz,若再搭配意法半导体独有的且基于内核耦合存储器(CCM-SRAM) 的程序加速(Routine Booster) 功能,其电机控制等例行程序的执行速度可比原来提升43%。STM32F3系列属于共有600余款产品的STM32产品家族,性能表现比STM32F1 Cortex-M3系列更加出色。STM32系列产品的软硬件具有广泛的共性,并提供简单易用的设计工具和开发生态系统。 基本资料 【产品新闻】意法半导体(ST)推出闪存容量高达512KB的STM32F3微控制器,大幅提升系统集成度 【数据手册】STM32F358xC、STM32F378xx、STM32F318、STM32F302、STM32F303等ARM Cortex-M4 32位内核 【硬件资源】STM32F3系列固件、软件、工具资源 【视频】意法半导体STM32F3系列探索套件(discovery kit)介绍 进阶设计 目前意法半导体针对智慧型手机Sensor Hub提供采用Cortex-M0核心开发的STM32F072、采用Cortex-M4核心开发的STM32F301和STM32F401,以及采用Cortex-M4核心开发的STM32F429,其中三星(Samsung)智慧型手机Note 3的Sensor Hub中,即搭载该公司STM32F401。 【STM32F303开发】+视觉姿态识别 对一个目标进行姿态识别,以简单的三角形为例,目标放置在一个旋转平台上,初始姿态位置,通过图像识别姿态,并将姿态数据传送给nucleo,nucleo驱动舵机进行角度调整。

Android设备与STM32单片机通信方式探讨

Android设备与STM32单片机通信方式探讨 摘要:随着科学技术的进步与人们生活水平的提升,Android设备也以其成本低廉、开发难度小、开放性强等优势,成为人们手中主要的网络设备。而Android平板电脑是当前非常流行的一种移动终端,本文便以Android平板电脑为例,研究Android设备与STM32单片机之间的音频通信、串口通信以及Bluetooth通信三种通信方式。 关键词:Android设备STM32单片机通信方式 中图分类号:TP368.1 文献标识码:A 文章编号:1007-9416(2016)01-0000-00 所谓STM32,指的是以ARMCortex-M3为基础的STMicroelectronics嵌入式32为微处理器,具有成本低、性能高、能耗少等优势。从性能的角度出发,微处理器可以分为基本型、互联型以及增强型几个种类,以适用于产品的不同性能要求。而Android则是一种以Linux为基础的操作系统,普遍适用于智能终端设备,如平板电脑、智能手机等,越来越受到市场的广泛认同。 1 音频通信 耳机孔是Android设备中必不可少的,用于输入与输出麦克和耳机中的音频信号,耳机引脚的构成如图1所示:

图1 耳机引脚的构成 根据图1所示,可以运用两个声道中的任意一个,作为Android设备向STM32单片机进行信号传输的通信线,而MIC 麦克则可以作为STM32单片机向Android设备进行信号传输的通信线[1]。由于音频信号是一种模拟信号,因此,需要调制传输过程中的数字信号,现阶段常用的调制方法有AM、FM以及PM,其中,AM虽然相对简单,但在抗干扰能力方面相对较差,所以,当前普遍运用的方法是FM与PM。应用相关广泛的音频调制方式为DTMF,市场上有很多与之相对应的编解码芯片,这些芯片能够在很大程度上简化对STM32单片机的开发环节。 在音频通信的过程中,其运作难点主要集中在调制与解调方面,STM32单片机可以运用当前相对成熟的芯片来完成对硬件的调制与解调工作,但是,Android设备在这方面却需要自行完成[2]。另外,一般情况下,20kHz是音频信号传输过程中的普遍上限,所以,运用音频进行通信的速率也相对较低,这种方式只适用于手持式刷卡机。 2串口通信 在嵌入式系统中,串口通信是最常见的通信方式,运用这种方式进行通信,STM32单片机的开发难度相对较小,其引脚、波特率、中断函数等参数都可以进行有针对性的设置,操作简单方便。

STM32 虚拟串口win7(64位)或XP驱动

;------------------------------------------------------------------------------ ; STMicroelectronics Comunication Device Class driver (CDC) INF FILE ; (C)2009 Copyright STMicroelectronics ;------------------------------------------------------------------------------ [Version] Signature="$Windows NT$" Class=Ports ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} Provider=%MANUFACTURER% LayoutFile=layout.inf ;CatalogFile=%FILENAME%.cat DriverVer= 9/20/2009,1.2.0 [Manufacturer] %MANUFACTURER%=DeviceList,NTamd64 [DestinationDirs] DefaultDestDir=12 ;------------------------------------------------------------------------------ ; Windows 2000/XP/Vista32 Support ;------------------------------------------------------------------------------ [DriverInstall.nt] include=mdmcpq.inf CopyFiles=DriverCopyFiles.nt AddReg=DriverInstall.nt.AddReg [DriverCopyFiles.nt] usbser.sys,,,0x20 [DriverInstall.nt.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,%DRIVERFILENAME%.sys HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" [DriverInstall.nt.Services] AddService=usbser, 0x00000002, DriverService.nt [DriverService.nt] DisplayName=%SERVICE%

7. STM32 控制步进电机正方转

实验目的:利用STM32 来控制步进电机正反转 实验设备:STM32开发板,两相步进电机,24V&5V直流电源,丝杆导轨,DM422C 驱动器 图1 实物图 第一步弄清楚驱动器接线 1.1 ENA可以悬空 大部分使用者就是将ENA悬空的,就是电机通常不锁轴 1.2 OPTO 是共阳极端 1.2.1 如果用的是AVR ,就直接接到AVR 5V接线柱上。 1.2.2 如果用的是ARM,就将OPTO接到5V 电源上,记得电源要和ARM共地,这样才能识别接的电源是5V 第二步弄清楚脉冲的发送形式,即Delay函数作用 清楚脉冲的发送形式,即Delay函数作用,

弄清楚接口由哪个GPIO口控制,然后连接硬件图, 通过电源IO控指示灯检验信号发送: 第三步主程序 下面这个程序是 /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" void Delay (u32 nCount) { for(; nCount != 0; nCount--); } void GPIO_Config() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE);

STM32F103ZE手册

EM-STM3210E评估板用户手册 V1.0 深圳市英蓓特信息技术有限公司 Embest info & Tech Co., Ltd. 地址:深圳市罗湖区太宁路85号罗湖科技大厦509室(518020) Telephone: 86-755-25532557 25638952 25535753 25505451 Fax: 86-755-25616057 E-mail: sales@https://www.wendangku.net/doc/3c9167398.html, support.realview@https://www.wendangku.net/doc/3c9167398.html, Website: https://www.wendangku.net/doc/3c9167398.html, https://www.wendangku.net/doc/3c9167398.html,

第一章概述 EM-STM3210E是英蓓特公司新推出的一款基于ST意法半导体STM32系列处理器(Cortex-M3内核)的全功能评估板。功能接口丰富,是一个用于应用开发很好的平台,也是学习者的首选。配合本公司的调试工具ULINK2一起使用,更是为大家提供了一个良好的开发环境,从而为自己的应用开发节省了时间,提高的效率。 EM-STM3210E评估板主要性能: ◆处理器:STM32F103ZE,主频:72MHz ◆2MB NOR FLASH ◆128KB SRAM ◆128MB NAND FLASH ◆8M byte SPI Flash ◆RTC( 带后备电池) ◆启动跳线设置 ◆两路可选电源:5VDC供电,USB供电 ◆一个SD存储卡接口 ◆TFT- LCD屏接口 ◆一个温度传感器 ◆一路DAC音频输出 ◆20Pin JTAG调试接口 ◆2个三线RS232串行口 ◆一个USB Device接口 ◆一个具有控制四个方向和确定功能的摇杆手柄 ◆四个功能按键:Reset,Wakeup,Temper和User按键 ◆四个Led灯 ◆四位八段数码管输出 ◆一个CAN总线接口,通过DB9接口引出 ◆一路AD输入 ◆四个26Pin用户扩展接口

基于STM32的步进电机控制系统

基于STM32的步进电机控制系统 沈阳航空航天大学 2010年6月

摘要 本文的主要工作是基于STM32步进电机控制系统的设计。随着越来越多的高科技产品逐渐融入了日常生活中,步进电机控制系统发生了巨大的变化。单片机、C 语言等前沿学科的技术的日趋成熟与实用化,使得步进电机的控制系统有了新的的研究方向与意义。本文描述了一个由STM32微处理器、步进电机、LCD显示器、键盘等模块构成的,提供基于STM32的PWM细分技术的步进电机控制系统。该系统采用STM32微处理器为核心,在MDK的环境下进行编程,根据键盘的输入,使STM32产生周期性PWM信号,用此信号对步进电机的速度及转动方向进行控制,并且通过LCD显示出数据。结果表明该系统具有结构简单、工作可靠、精度高等特点. 关键词:STM32微处理器;步进电机;LCD显示;PWM信号;细分技术

Abstract As well as the high-tech products gradually integrated into the daily life,servo control system has undergone tremendous changes.SCM and C language of the frontier disciplines such mature technology and practical,steering control system is a new research direction and meaning.This paper describes a STM32 microprocessors, steering, LCD display and keyboard, Based on the STM32 servo control system of PWM signal,This system uses STM32 microprocessor as the core, MDK in the environment, according to the keyboard input , STM32 produce periodic PWM signal, with this signal to the velocity and Angle of steering gear control, and through the LCD display data. The features of the simple hardware, stable operation and high precision are incarnated in the proposed system. Keywords:STM32 microprocessors; Steering system; LCD display;pulse width modulation signal;Subdivide technology

stm32103与window虚拟串口

现在很多电脑已经不带232了,特别是手提电脑。这使很多使用手提在外调试人员非常不方便。或许你可以买一条市面上usb转232转换线,但这些线抗干扰不是太好,在一些干扰大的地方会发生连接中断的问题,所以往往要加光耦隔离器。在一些高端的单片机一般带USB接口,如果可以使用这些接口做一个USB的虚拟com口将会非常实用,但是使用USB一般要编写上位机驱程。没有windows驱程编写基础的朋友一般很为难。其实微软的CDC类中含有这一类USB转com的类,Windows也自带这方面的驱程。就像市面上的usb鼠标,u盘一样,windows里面已经有了他们的驱动函数库,只要我们按照windows的CDC描述来配置USB就可以了。 关于CDC的类描述类容请参考Universal Serial Bus Class Definitions for Communication Devices 的PDF文件。它是下面所有内容的纲领。 下面讲解下制作步骤: 1:把对应的描述符发送出去:下面是发送内容 const USB_DEVICE_DESCRIPTOR DeviceDescr = { // device descriptor 0x12, DESC_DEVICE, LE_WORD(0x0101), // bcdUSB 0x02, // bDeviceClass 0x00, // bDeviceSubClass 0x00, // bDeviceProtocol MAX_PACKET_SIZE0, // bMaxPacketSize //设备ID LE_WORD(0xFFFF), // idVendor LE_WORD(0x0005), // idProduct LE_WORD(0x0100), // bcdDevice /* 不要使用原来的ID 0x71,0x04, // PHILIPS公司的设备ID Vendor ID = PHILIPS Semiconductor,Inc. 0x78,0x23, // 设备制造商定的产品ID Product ID 0x00,0x01, // 设备系列号Device release number in binary-coded decimal */ 0x01, // iManufacturer 0x02, // iProduct 0x03, // iSerialNumber

STM32控制步进电机程序

#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "timer.h" #include "key.h" int main(void) { u8 t; u32 v=100; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化 LED_Init(); //初始化与LED连接的硬件接口KEY_Init(); //初始化与按键连接的硬件接口 RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0X0FFFFFFF; GPIOA->CRL|=0X30000000;//PA7推挽输出 GPIOA->ODR|=1<<7; //PA7 输出高 GPIOA->CRL&=0XFF0FFFFF; GPIOA->CRL|=0X00300000;//PA5推挽输出 GPIOA->ODR|=1<<5; //PA5 输出高 LED1=1; LED0=1; while(1) { t=KEY_Scan(0); //得到键值 switch(t) { case KEY0_PRES: v=v+10; TIM3_Int_Init(v,7199);//10Khz的计数频率 TIM3->CR1|=0x01; break; case KEY1_PRES: v=v-10 ; TIM3_Int_Init(v,7199);//10Khz的计数频率 TIM3->CR1|=0x01; //使能定时器3 break; case WKUP_PRES: TIM3->CR1&=0xFE;//关定时器3; break; }

STM32用IO口控制步进电机的简单程序

STM32用IO口控制步进电机的简单程序 练习IO口库函数操作。//相序uint16_tphasecw[4] ={0x2000,0x0001,0x0004,0x0008};//D-C-B- Auint16_tphaseccw[4]={0x0008,0x0004,0x0001,0x2000};//A-B-C-D //步进电机相关IO口初始化 //IN4:PC13//IN3:PC0//IN2:PC2//IN1:PC3voidMoto_Init(void){GPIO_InitTypeDefG PIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABL E);//GPIOCLOCKENABLEGPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_Ini tStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率 GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 输出低电平 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOC,&GPIO_InitStructur e);GPIO_ResetBits(GPIOC,GPIO_Pin_0);GPIO_InitStructure.GPIO_Pin=GPIO_Pin _2;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_ResetBits(GPIOC,GPIO_Pin_2); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;GPIO_Init(GPIOC,&GPIO_InitStructur e);GPIO_ResetBits(GPIOC,GPIO_Pin_3);} //电机正转voidMotorcw(void){uint8_ti;for(i=0;i记得使能IO口时钟。 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM32的USB虚拟串口设计

毕业设计 [论文] 题目:基于STM32的USB虚拟串口 学院: 专业: 姓名: 学号: 指导老师: 完成时间:2014年5月19日

摘要 USB接口由于支持热插拔和标准统一等特点得到了广泛应用,越来越多的电脑设备开始采用USB接口进行数据的传输,而如何在不改变现有应用软件的情况下,将设备移植到USB接口成为人们研究的热门。 论文以USB通信设备类中的抽象控制模型为基础,研究了通信设备类及实现虚拟设备的原理,设计并实现了基于通信设备类的虚拟串口驱动程序。 论文研究设计了基于通信设备类的虚拟串口驱动程序的结构和实现方案,程序主要由通信命令转换和数据传输两部分构成,通信命令转换符合通信设备类中抽象控制模型的规范,数据传输部分对现有虚拟串口的实现技术进行了改进。论文的主要工作如下: 1)研究了USB协议的请求和传输模式,分析了通信设备类实现虚拟设备的方案。 2)给出了一种符合通信设备类中抽象控制模型的虚拟串口实现方案。该方案提供了 一种基于通信设备类开发虚拟设备的模板,对设计中的诸多问题进行了详细的说明,并改进了虚拟串口驱动程序中数据的处理流程。 3)将改进后的数据处理流程应用于虚拟串口的实现中,生成了一种基于通信设备类 的稳定、高速的虚拟串口。最后,在串口测试软件下对虚拟串口驱动程序进行了测试,达到了预期目标。 关键字:通讯设备类;枚举过程;虚拟串口程序;抽象控制模型

Abstract USB interface supports plug and play which has unified standards, so it has a wide ra nge of applications. More and more computer device use USB interface to transfer data, so how to make many old deaves to support USB interface without changing current applicati on is becoming the hot field. USB Communication Device Class and it's abstract control model are studied, princip les of Communication Device Class and implementation techniques of abstract device are a lso analyzed in the thesis. On the basis of this, design and implementation of virtual serial port driver based on Communication Device Class are given. The overall structure and implementation scheme of virtual serial port driver based on CDC are designed. The virtual serial port driver is made up of two parts which are commu nication command transfer module and data transmission module. The communication com mand transfer module satisfies the specification of abstract control model, and the data tran sfer part improves the technique of current virtual serial port. The main works in the thesis are as follows: 1)The request and transfer model for USB protocol are studied, and the implementation t echniques of virtual serial port are analyzed. 2)The implementation scheme of virtual serial port driver that satisfy abstract control mo de in CDC is graven. A new template for the development of virtual serial port based o n CDC is brought out, and it describes some issues for the virtual serial port driver in d etails, at the same time, the processing steps for virtual serial port driver is improved. 3)The improved data processing steps for virtual serial port driver is applied in the impl ementation of ritual serial port driver, and a stable, high-speed virtual serial port is ma de. At last, the test for the virtual serial port driveon ActiveSync is given, and the test r esult show that it's function is achieved the requirement goals. Keywords: Communication Device Class ;Enumeration Process; Virtual Serial Port Driver ;Abstract Control Model

步进电机-插补算法stm32

#include "stm32f10x.h" #include "delay.h" #include "misc.h" #include #include "stm32f10x_tim.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include voidRCC_Configuration(void); voidGPIO_Configuration(void); voidNVIC_Configuration(void); voidTIM_Configuration(void); voidUSART_Configuration(void); intfputc(intch,FILE *f); intfgetc(FILE *f); float Mx=1.44f,My=2.88f;//起点 float Nx=10.0f,Ny=7.61f;//终点 float X1,Y1; float X2,Y2; float X3,Y3;//三种方法走后的坐标 float k;//斜率 float b;//y=kx+b float X,Y;//实际运行的坐标 float Delta1,Delta2,Delta3,Delta4;//三种方法的误差,4为不走最后一步的误差float Delta;//实际误差 // float DeltaMax;//最大误差 char way;//选择的走法 int a;//TIM6 中断次数 intnum=0;//总步数 inttx=1,ty=1;//用来判断中断是否发生 intnumx,numy;//计XY的步数 int counter=0;//计数值 float time;//时间 float nxd,nyd;//开始减速坐标 floatnx,ny;//nx=Nx-0.0144f; float fenmu;//公式中分母 // intfrex[20]={2,10,30,60,100,150,220,300,390,500}; // intfrey[20]={2,10,30,60,100,150,220,300,390,500}; int frex[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901}; int frey[20]={1098,2931,7585,18242,37754,62245,81757,92414,97068,98901}; intprex[20]={0};

相关文档
相关文档 最新文档