在不同的项目中,MCU的IO管脚由于布线等差异会做调整,因此硬件UART/SPI等管脚也需要重新配置。现将STC15单片机的UART/SPI管脚切换配置记录如下,【其它型号的MCU切换方法和代码相同(或类似),具体对应的管脚以MCU的数据手册为准】。
STC15单片机 UART /SPI 管脚切换配置
1、(头文件及)常量定义
#include "stc15.h"
#define FOSC 11059200L //系统频率
#define BAUD 115200 //串口波特率
//-----uart相关常量定义----------------------------------------
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT NONE_PARITY //定义校验位
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
//-------SPI相关寄存器常量定义-------------------------------
#define SPI_S0 0x04
#define SPI_S1 0x08
#define SPIF 0x80 //SPSTAT.7
#define WCOL 0x40 //SPSTAT.6
#define SSIG 0x80 //SPCTL.7
#define SPEN 0x40 //SPCTL.6
#define MSTR 0x10 //SPCTL.4
2、UART管脚切换设置
void UartSwitch(void)
{
ACC = P_SW1; //切换到第1组UART引脚
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
// ACC = P_SW1; //切换到第2组UART引脚
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
// ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
// P_SW1 = ACC;
//
// ACC = P_SW1; //切换到第3组UART引脚
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
// ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
// P_SW1 = ACC;
}
3、 SPI管脚切换配置及初始化
void InitSpi() //initial SPI
{
// ACC = P_SW1; //切换到第1组SPI引脚
// ACC &= ~(SPI_S0 | SPI_S1); //(SPI_S0)=0, (SPI_S1)=0
// P_SW1 = ACC; //(P1.2/SS, P1.3/MOSI, P1.4/MISO, P1.5/SCLK)
// ACC = P_SW1; //切换到第2组SPI引脚
// ACC &= ~(SPI_S0 | SPI_S1); //(SPI_S0)=0, (SPI_S1)=1
// ACC |= SPI_S0; //(P2.4/SS_2,P2.3/MOSI_2,P2.2/MISO_2,P2.1/SCLK_2)
// P_SW1 = ACC;
ACC = P_SW1; //切换到第3组SPI引脚
ACC &= ~(SPI_S0 | SPI_S1); //(SPI_S0)=0, (SPI_S1)=1
ACC |= SPI_S1; //(P5.4/SS_3,P4.0/MOSI_3,P4.1/MISO_3,P4.3/SCLK_3)
P_SW1 = ACC;
SPSTAT = SPIF | WCOL;
SS = 1;
SPCTL = SSIG | SPEN |MSTR;
}
4、UART初始化举例
void Uart1Init()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;//定时器2
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
ES = 1;
}