雅特力AT32芯片选型

AT32命名规则

雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器创新趋势的芯片(MCU)设计公司,专注于ARM ®Cortex®-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM® Cortex®-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。

雅特力AT32F403A例程之-USB之HID双向通信

前言

1.雅特力AT32F403A例程之-USB之HID双向通信,实现了USB的HID双向通信。

一、官方提供BSP存在的问题

说明:官方提供HID功能只实现了IN也就是发送数据到PC上,OUT也就是接收无法实现。经过多次测试,结果发现只有下面的例程可以实现。

1
AT32F403A\BSP\AT32F403A_407_Firmware_Library_V2.0.7\utilities、at32f403a_407_usb_iap_demo

二、USB之HID双向通信实现

1.初始化USB

代码如下(示例):

DOS编程:NASM汇编器入门与宏编程

NASM 简介

NASM 全称 The Netwide Assembler ,是一款基于 x86 平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。 NASM 支持大量的文件格式,包括 Linux , BSD , a.out , ELF , COFF , Mach−O , Microsoft 16−bit OBJ , Win32 以及 Win64 ,同时也支持简单的二进制文件生成。它的语法被设计的简单易懂,相较 Intel 的语法更为简单,支持目前已知的所有 x86 架构之上的扩展语法,同时也拥有对宏命令的良好支持。

STC8H用串口2实现的收发通讯协议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78


#include <STC8H.H> //8H头文件
#include <UART2.H>
#include <UART1.H>
bit busy2;
char Uart2_RecvBuf[30] = {0}; //串口数据缓存
char uart2Index = 0;          //绶存指针
char uart2RXEnd = 0;
char Uart2RXLength = 0;


/*-------------------------------------------屏幕通信初始化----------------------------------------------*/
void Uart2Init(void) //9600bps@11.0592MHz
{
    S2CON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
    T2L = 0xE8;        //设定定时初值
    T2H = 0xFF;        //设定定时初值
    AUXR |= 0x10;        //启动定时器2

    S2CON |= 0x10; //使能接收 S2REN=1
    IE2 |= 0x01;   //使能串口2中断
    EA = 1;
}


/*-------------------------------------------接收信息----------------------------------------------*/
void Uart2() interrupt 8{
    if ((S2CON & S2RI) && uart2RXEnd == 0) {
        S2CON &= ~S2RI; //清除S2RI位
        P47 = ~P47;
        Uart2_RecvBuf[uart2Index] =
                S2BUF;
        if (Uart2_RecvBuf[0] == 0xFE) //Uart2_RecvBuf协议第一个字节是0x5a
        {
            uart2Index++;
        }
        if (uart2Index > 5) {
            uart2Index = 0;
            uart2RXEnd = 1;
        }
    }
    if (S2CON & S2TI) {
        S2CON &= ~S2TI; //清除S2TI位
        busy2 = 0;       //清忙标志
    }
}

char aaa[5] = {0xfe, 0xbb, 0x01, 0x00, 0x16};

void UartRx2(void) {
    if (uart2RXEnd) {
        uart2RXEnd = 0;
        UART1_SendStr(Uart2_RecvBuf);
        SendString2(aaa, 5);
    }

}


/*-------------------------------------------发送----------------------------------------------*/
void SendData2(char dat) {
    while (busy2); //等待前面的数据发送完成
    //ACC = dat;                  //获取校验位P (PSW.0)
    busy2 = 1;
    S2BUF = dat; //写数据到UART2数据寄存器
}


void SendString2(char *s, char length) //发送字符串
{
    while (length != 0) //检测字符串结束标志
    {
        SendData2(*s++); //发送当前字符
        length--;
    }
}

STC8H系列单片机串口2的使用

最近做项目用需要用到两个串口,分别是串口1和串口2,

串口1接调试,传感器等,串口2对接蓝牙与APP通讯

芯片型号:STC8H3K64S4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "stc8h.h"
#define S2RI 0x01        //串口2接收中断请求标志位
#define S2TI 0x02        //串口2发送中断请求标志位
 
char flag = 0;
unsigned char UART2_ReceiveBuffer[10]={0};
void Uart2_Init(void)		//9600bps@22.1184MHz
{
	S2CON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0xC0;			//设定定时初值
	T2H = 0xFD;			//设定定时初值
	AUXR |= 0x10;		//启动定时器2
	EA = 1;
	IE2 = 0X01;        //打开接收中断
}


void UART2_SendByte(unsigned char mydata)
{
    IE2 = 0X00;
	S2CON&=~S2TI; //TI = 1
    S2BUF=mydata;
    while((S2CON&S2TI)==0);
	S2CON&=~S2TI; //TI = 1//清除发送标志位
    IE2 = 0X01;
}

void Uart2_SendString(unsigned char *p)   //串口2发送一个字符串
{
    while(*p!='\0')
    {
        UART2_SendByte(*p);
        p++;
    }
}
void Uart2_InterruptService(void) interrupt 8
{
	unsigned char temp;
	static char i = 0;
    if(S2CON&S2RI)		//RI == 0
    {
		flag = 1;
        S2CON&=~S2RI;	//RI = 1
        temp = S2BUF;
		UART2_ReceiveBuffer[i] = temp;
		if(i == 10)
		{
			i=0;
		}else{
			i++;
		}
    }
}
void main()
{
	Uart2_Init();
	Uart2_SendString("start\n");
	while(1)
	{
		if(flag == 1)
		{
			IE2  &= ~S2RI; 
			S2BUF = temp;
			while(!(S2CON&S2TI));
			S2CON&=~S2TI;
			IE2  |= S2RI; 
			flag = 0;
		}
	}
}

注意: