dmx512协议的编程c语言,我在此分享一份DMX512协议的发送程序,希望对做灯光控制的人有一定的帮助(我测试过了跟DMX512控制台发出的方波是一样一样的)...
/************************************************************
*函數名稱:void uart2_init(u32 bound)
*功? ? 能:串口2初始化函數
*說? ? 明:初始化IO 串口2
*輸入參數:bound:波特率
*輸出參數:無
*************************************************************/
void uart2_init(u32 bound) //串口2初始化函數
{
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);??//使能USART2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);? ? ? ???//使能引腳復用,GPIOA時鐘
USART_DeInit(USART2);??//復位串口2
//USART2_TX? ?PA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;? ? ? ? //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure); ? ? ? ? ? ? ? ? //初始化PA2
//USART2_RX? ? ? ?? ?PA.3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);??//初始化PA3
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;??//搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;? ? ? ? ? ? ? ? ? ? ? ???//子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);? ? ? ? //根據指定的參數初始化VIC寄存器
//USART 初始化設置
USART_InitStructure.USART_BaudRate ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = bound;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ?? ? //一般設置為9600;
USART_InitStructure.USART_WordLength ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = USART_WordLength_9b;? ?? ?? ???//字長為8位數據格式
USART_InitStructure.USART_StopBits ? ? ? ? ? ? ? ???? ? ? ? ? ? ? ? ? ? ? ?? ?= USART_StopBits_1;? ?? ?? ?? ???//一個停止位
USART_InitStructure.USART_Parity ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = USART_Parity_No;? ?? ?? ?? ?? ?//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = USART_Mode_Rx | USART_Mode_Tx; //收發模式
USART_Init(USART2, &USART_InitStructure); ? ? ? ? ? ? ? ? //初始化串口2
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟接收中斷? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???//接收個數清零
USART_Cmd(USART2, ENABLE);? ?? ?? ?? ?? ?? ???//使能串口2
}
/************************************************************
*函數名稱:void USART2_IRQHandler(void)
*功? ? 能:串口中斷函數
*說? ? 明:串口2中斷服務程序
*************************************************************/
void USART2_IRQHandler(void)? ?? ?? ?? ?? ? ? ? ? ? //串口2中斷服務程序
{
static u16 UDR=0;
static u16 RXB8=0;
static uint16_t pDMX_buf = 0;??//數據指針
static uint8_t fDMX_buf_right = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//USART_FLAG_RXNE
{
IWDG_ReloadCounter();? ? //喂狗
UDR??= USART_ReceiveData(USART2);??//16bit??0-8??9bit
RXB8 = (UDR&0x0100);??//得到第9位數據
if(RXB8 == 0) //如果是復位信號
{
if(!UDR) //如果數據為0
{
fDMX_buf_right = 1; //接收數據正確
pDMX_buf = 0;? ?? ? //直接接收第一個數據,不保存第0個數據
}
}
else??//rxb8=1 pDMX_buf =1 調光數據
{
if(1 == fDMX_buf_right)
{
RXDData[pDMX_buf++] = (u8)UDR; //得到8位的數據
//接收到0-192個數據
if(pDMX_buf > 20)
{
fDMX_buf_right = 0;
DMXSignalFlag = 1; ? ? ? ? ? ? ? ? //更新調光數據
}
}
}
}
//--------------------------------接收中斷---------------------------------------------
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
// Disable the USART2 Transmit interrupt
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);? ? ? ???//清中斷 要不然一直執行此中斷 OK
}
}
總結
以上是生活随笔為你收集整理的dmx512协议的编程c语言,我在此分享一份DMX512协议的发送程序,希望对做灯光控制的人有一定的帮助(我测试过了跟DMX512控制台发出的方波是一样一样的)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言小知识——uthash使用
- 下一篇: 共阳极管的代码_《手把手教你学FPGA》